Регулярні вирази php заміна символів. Регулярні вирази PHP. Виняткові класи символів

PHP, як і належить сучасній мові програмування, пропонує розробнику набір функцій для використання регулярних виразів. Можна шукати входження рядків до інших рядків за складними критеріями.

  • PREG_PATTERN_ORDER;
  • PREG_SET_ORDER.

Сортування за першим варіантом групує результати пошуку за номером регулярного виразу (за замовчуванням). У другому випадку результати групуються за місцем їх перебування у рядку.

Символ - елемент шаблону

Важливо пам'ятати, що шаблон оперує символами. Програмування вже давно забуло, що таке тип даних "символ". Сучасні мови не опускаються нижче за поняття "рядок", але щодо шаблону треба розуміти: тут маніпулюють символами.

Побудова шаблону - це, насамперед, вказівку потрібної послідовності символів. Якщо це чітко засвоїти, то помилок у шаблоні не буде. Принаймні буде набагато менше.

  • а – це конкретний елемент шаблону – символ.
  • a-z – це елемент шаблону, теж один символ, але лише зі значенням від a до z – вся латиниця в нижньому регістрі.
  • 0-9 - це одна цифра, причому будь-яка, а ось 1-3 - лише 1, 2 або 3.

Регістр у шаблоні важливий. Перший та останній символи шаблону мають велике значення. Можна вказати, з чого починається шаблон і що закінчується.

Шаблон функції

PHP preg match all використовує стандартний синтаксис регулярних виразів. позначають один із символів, який у них зазначений:

  • лише символи a, b, c.
  • [^ABC] все, крім символів A, B, C.
  • \w і \W - текстовий або текстовий символ.
  • \s і \S - символ пробілу або пробілу.
  • \d і \D - цифра чи цифра.

Символи повторення позначаються фігурними дужками - (n,m) і відносяться до попереднього символу.

  • n означає повторення "не менше";
  • m – повторення "не більше".

Синтаксис передбачає безліч варіантів для створення шаблонів, але краще починати з азів, тобто з простих, власноруч написаних, в яких складні елементи та комбінації відсутні.

Простіше кажучи, перерахувавши реальні символи, які потрібні, вказавши їх потрібні кількості та врахувавши, що символ "^" відповідає початку, а "$" - кінцю рядка, можна створювати прості шаблони. Аналізуючи реальні налагоджені регулярні вирази від кваліфікованих фахівців, можна знайти міцні знання для створення складних застосувань preg match all. Арсенал PHP не обмежений лише цими двома функціями, але вони найчастіше використовуються.

Проста практика

Шаблон для цілого числа:

  • "/*/"

Теж шаблон цілого числа, але спереду може бути знак ("+", "-"), і спереду/ззаду можуть бути зайві прогалини:

  • /^[\s|\+|\-](0,1)*/

Аналогічно:

  • /^[\s|\+|\-](0,1)*(\.)*/ - число з точкою.
  • /+@+\.(2,3)/ - варіант для розпізнавання електронної пошти.

Застосування власних шаблонів для preg match all, приклади їх у інтернеті, аналіз коду сторінок сайтів та інші джерела дозволяють сформувати власну бібліотеку шаблонів.

Варіантів для пошуку інформації може бути безліч. Зокрема, наведені останні дві конструкції можна змоделювати інакше. У багатьох випадках перевага матиме той шаблон, який швидше та точніше забезпечить потрібний збіг. Застосування на PHP preg match all, як і аналогічних функцій іншими мовами, вимагає практики, уваги та попередньої перевірки правильності шаблонів.

У цій статті надана добірка php regexp прикладів. Дуже гарна та корисна колекція прикладів регулярних виразів (regular expressions). Всі приклади регулярних виразів є прийнятними для PHP. Використовуйте на здоров'я!

Приклад перевірки доменного імені

Даний, php сніпет перевіряє, чи є рядок допустимим доменним ім'ям.

?:.*)+):?(d+)?/?/i", $url)) ( echo "Your url is ok."; ) else ( echo "Wrong url."; )

Приклад підсвічування слова в тексті

Дуже корисний регулярний вираз для пошуку та підсвічування потрібного слова в тексті. Особливо код корисний, під час створення висновку результатів пошуку.

$text = "Сample sentence from KomunitasWeb, regex has become popular in web programming. Next we learn regex. Посилання на wikipedia, Regular expressions (abbreviated as regex or regexp, with plural forms regexes, regexps, or regexen) are written in a formal language that can be interpreted by regular expression processor"; $text = preg_replace("/b(regex)b/i", " 1", $text); echo $text;

Приклад реалізації підсвічування результатів пошуку уWordPress

Відкрийте файл search.php та знайдіть функцію the_title(). Замініть її наступним рядком:

Echo $title;

А тепер, перед заміненим рядком, вставте цей код:

\0", $title); ?>

Збережіть файл search.php і відкрийте style.css. Додайте до нього наступний рядок:

Strong.search-excerpt ( background: yellow; )

Приклад отримання зображень зHTML методом regexp

Даний шматок php коду використовує регулярні вирази, шукає всі зображення та адресу url до них.

$images = array(); preg_match_all("/(img|src)=("|")[^"">]+/i", $data, $media); unset($data); $data=preg_replace("/(img|src)("|"|="|=")(.*)/i","$3",$media); foreach($data as $url) ( $info = pathinfo($url); if (isset($info["extension"])) ( if (($info["extension"] == "jpg") || ($info["extension"] == "jpeg") || ($info["extension"] == "gif") || ($info["extension"] == "png")) array_push($ images, $url); ) )

Видалення слів, що повторюються (без урахування регістру)

Чи часто зустрічаються слова, які повторюються? Тоді приклад цього регулярного виразу буде корисним.

$text = preg_replace("/s(w+s)1/i", "$1", $text);

Видалення точок, що повторюються

Те ж саме, тільки з точками, що повторюються.

$text = preg_replace("/.+/i", ".", $text);

Відповідність XML / HTML тегів

Ця проста функція приймає два аргументи: тег (відповідності якому ви хочете знайти), XML або html код.

Function get_tag($tag, $xml) ( $tag = preg_quote($tag); preg_match_all("(<".$tag."[^>]*>(.*?).")", $xml, $matches, PREG_PATTERN_ORDER); return $matches; )

Пошук XHTML/XML тегів із певними значеннями атрибутів

Цей приклад схожий на попередню функцію, тільки ви можете значно розширити пошук.

.

Function get_tag($attr, $value, $xml, $tag=null) ( if(is_null($tag)) $tag = "\w+"; else $tag = preg_quote($tag); $attr = preg_quote($ attr); $value = preg_quote($value); $tag_regex = "/<(".$tag.")[^>]*$attr\s*=\s*". "(["\"])$value\\2[^>]*>(.*?)<\/\\1>/" preg_match_all($tag_regex, $xml, $matches, PREG_PATTERN_ORDER); return $matches; )

Пошук шістнадцяткових значень кольору

Відмінний приклад регулярного виразу, який шукає відповідності шістнадцяткових значень кольору у заданих рядках. Для чого це? Можливо, ви хочете написати сервіс зі стиснення CSS коду або щось подібне.

$string = "#555555"; if (preg_match("/^#(?:(?:(3))(1,2))$/i", $string)) ( echo "example 6 successful."; )

Приклад пошукуtitle на заданій сторінці

Цей цікавий приклад PHP коду з regexp шукає та повертає текст між тегами і.

Feof($fp))( $page .= fgets($fp, 4096); ) $titre = eregi(" (.*)",$page,$regs); echo $regs; fclose($fp);

Парсинг логу Apache

Більшість сайтів працюють на відомих серверах Apache. Якщо ваш сайт також працює на ньому, можна зробити парсинг лога сервера за допомогою php regexp.

//Logs: Apache web server //Successful hits to HTML files only. Застосовується для Counting number of page views. "^((?#client IP або domain name)S+)s+((?#basic authentication)S+s+S+)s+[((?#date and time)[^]]+)]s+"(?: GET|POST|HEAD) ((?#file)/[^?"]+?.html?)??((?#parameters)[^?"]+)? HTTP/+"s+(?#status code)200s+((?#bytes transferred)[-0-9]+)s+"((?#referrer)[^"]*)"s+"((?#user agent )[^"]*)"$" //Logs: Apache web server //404 помилки тільки "^((?#client IP or domain name)S+)s+((?#basic authentication)S+s+S+) s+[((?#date and time)[^]]+)]s+"(?:GET|POST|HEAD) ((?#file)[^ ?"]+)??((?#parameters)[ ^ ?"]+)? HTTP/+"s+(?#status code)404s+((?#bytes transferred)[-0-9]+)s+"((?#referrer)[^"]*)"s+"((?#user agent )[^"]*)"$"

Приклад перевірки складності пароля

Відмінний приклад регулярного виразу, що перевіряє рівень складності пароля. Пароль повинен складатися з шести символів, містити хоча б: один заголовний символ, малий символ, цифру.

"A(?=[-_a-zA-Z0-9]*?)(?=[-_a-zA-Z0-9]*?)(?=[-_a-zA-Z0-9]*?) [-_a-zA-Z0-9](6,)z"

Заміна текстових смайликів на графічні смайлики

Даний приклад коду змінюватиме текстовий смайлик, на ваш графічний. Цікавий та корисний php сніппет.

$texte="A text with a smiley:-)"; echo str_replace(":-)"," ", $ Texte);

Приклад регулярного виразу для отримання зображень зhtml коду

Варто сказати, що даний php код використовується в wordpress, для пошуку та обробки зображень.

post_content; $szSearchPattern = "~ ]* />~"; // Run preg_match_all до схопити всі зображення і зберегти результати в $aPics preg_match_all($szSearchPattern, $szPostContent, $aPics); // Check to see if we have at least 1 image count($aPics);if ($iNumberOfPics > 0) ( // Тут ви можете обробляти ваші зображення // У цьому прикладі вони просто виведуть на монітор for ($i=0; $i< $iNumberOfPics ; $i++) { echo $aPics[$i]; }; }; endwhile; endif; ?>

Сподіваюся, вам була корисна добірка прикладів php regexp. Якщо є цікаві доповнення або приклади регулярних виразів (PHP), пишіть у коментарях.

Опис функції:

Функція preg_replace шукає збіги регулярного виразу (pattern) з даними в рядку (subject) і замінює їх на дані, що знаходяться в replacement.

Аргумент

Опис

pattern

Обов'язковий аргумент.Регулярний вираз (шаблон пошуку)

string, array

replacement

Обов'язковий аргумент.Рядок або масив з даними, що використовуються для заміни даних в subject

Також для посилань можна використовувати конструкцію виду \$(1) рівнозначну \$1, це конструкція використовується якщо після посилання йде відразу цифра (\$(1)1).

string, array
subject Обов'язковий аргумент.Рядок або масив з даними, які будуть замінені. string, array
limit

Необов'язковий аргумент.Максимальна кількість замін. За замовчуванням одно -1 (не обмежено)

int
count

Необов'язковий аргумент.Змінна в якій міститься кількість зроблених замін.

int

Функція preg_replace() може використовуватись з модифікатором /e. За наявності цього модифікатора параметр replacement інтерпретується як PHP-код, а потім використовується для заміни.

Регулярні вирази

Окремо слід зупинитись на регулярних виразах, без уявлення про які досить важко (якщо взагалі можливо) розібратися з роботою функції preg_replace().

Досить добре опис регулярних виразів наводиться на wikipedia.org, основні моменти застосування регулярних виразів також описані

Приклади:

Приклад 1:

У цьому прикладі замінюємо всі цифри, поміщені в дужки на зірочки.

Приклад 2:

У цьому прикладі замінюємо рядок, що відповідає всьому шаблону, даними відповідними першій підмасці за посиланням \$1. Іншими словами "have 3 apples", відповідні "/(w+) (d+) (w+)/", буде замінено на have, відповідне (w+).

Приклад 3:

У цьому прикладі показано, що станеться якщо в якості pattern і replacement використовувати масиви.

Приклад 4:

У цьому прикладі показано, що станеться якщо в якості pattern, replacement і subject використовувати масиви.

Приклад 5:

У цьому прикладі показано використання модифікатора /e, тобто коли replacement інтерпретується як код php. Нижче показано перетворення символів з нижнього у верхній регістр.

Приклад 6:

У цьому прикладі показано використання аргументу count. Тут результат дорівнюватиме 2, так сталося дві заміни.

mixed preg_match(string pattern, string subject [, array &matches [, int flags [, int offset]]])

Шукає в заданому тексті subject збігу із шаблоном pattern

У випадку, якщо додатковий параметр matches вказаний, він буде заповнений результатами пошуку. Елемент $matches буде містити частину рядка, що відповідає входу всього шаблону, $matches - частина рядка, що відповідає першій підмасці, і так далі.

flags може приймати такі значення:

PREG_OFFSET_CAPTURE

У випадку, якщо цей прапор вказано, для кожного знайденого підрядка буде вказано її позицію у вихідному рядку. Необхідно пам'ятати, що цей прапор змінює формат даних, що повертаються: кожне входження повертається у вигляді масиву, в нульовому елементі якого міститься знайдена підрядка, а в першому - зміщення. Цей прапор доступний у PHP 4.3.0 і вище.

Додатковий параметр flags доступний з PHP 4.3.0.

Пошук здійснюється зліва направо, з початку рядка. Додатковий параметр offset може бути використаний для визначення альтернативної початкової позиції для пошуку. Додатковий параметр offset доступний з PHP 4.3.3.

Примітка:Використання параметра offset не еквівалентне заміні зіставлюваного рядка виразом substr($subject, $offset) при виклику функції preg_match_all()оскільки шаблон pattern може містити такі умови як ^ , $ або (? . Порівняйте:

У той час як цей приклад

Функція preg_match()повертає кількість знайдених відповідностей. Це може бути 0 (збіги не знайдені) та 1, оскільки preg_match()припиняє свою роботу після першого знайденого збігу. Якщо потрібно визначити чи порахувати всі збіги, слід скористатися функцією preg_match_all(). Функція preg_match()повертає FALSEу разі, якщо під час виконання виникли помилки.

Підказка:Не використовуйте функцію preg_match(), якщо необхідно перевірити наявність підрядка у заданому рядку. Використовуйте для цього strpos()або strstr()оскільки вони виконають це завдання набагато швидше.


Приклад 2. Пошук слова "web" у тексті

/*
Спеціальна послідовність \b у шаблоні означає межу слова,
отже, лише ізольоване входження слова "web" буде відповідати
масці, на відміну від "webbing" чи "cobweb".
*/
if (preg_match ("/\bweb\b/i" , "PHP is the web scripting language of choice.")) {
echo "Входження знайдено.";
) else (
echo "Входження не знайдено.";
)preg_match ("/\bweb\b/i" , "PHP is the website scripting language of choice.")) {
echo "Входження знайдено.";
) else (
echo "Входження не знайдено.";
}
?>

Давно хотів розібратися з регулярними виразами. Хоча «розібратися» — голосно сказано. Щоб осягнути велике мистецтво і стати володарем регулярних виразів, потрібно завжди мати з ними справу. Мало вивчити синтаксис, спецсимволи та модифікатори — треба вміти ними користуватися. А вміння користуватися приходить із досвідом.

У даному пості викладатиму приклади використання регулярних виразів, у роботі яких розібрався сам.

Таблиця спецсимволів

Спецсимвол Опис
\ Символ екранування. Приклад: '/seo\/smo/'— відповідає рядку, у якому є seo/smo.
^ Символ початку даних. Приклад: ‘/^seo/’- відповідає рядку, який починається словом seo.
$ Символ кінця даних. Приклад: '/блог$/'- відповідає рядку, який закінчується словом блог.
. Будь-який символ, окрім перекладу рядка. Приклад: '/seo.ult/'- відповідає рядку seopult, seo9ult, seo@ult і т.д.
Усередині цих дужок перераховуються символи, кожен із яких може стояти цьому місці, але тільки один. Приклад: '/seoult/'- під відповідність потраплять лише рядки, що містять seopult, seokult або seomult.
| Або. Приклад нижче.
() Підмаска.
? Одне або нуль входження попереднього символу чи підмаски.
* Будь-яка кількість входжень попереднього символу чи підмаски. У тому числі й нуль.
+ Одне чи більше входжень.
Приклад: '/se+(op|om)?.*t/'- літера s, потім одна або кілька літер e, після цього поєднання op або om може зустрічатися один раз, а може і жодного разу, потім будь-яку кількість символів і буква t.
(a, b) Кількість входжень попереднього символу або підмаски від a до b. Приклад: (0,) - те саме, що *, (0,1) - те ж, що?, (3,5) - 3, 4 або 5 повторень.

Прості приклади php скриптів з використанням регулярних виразів:

1) Попередні та наступні вирази.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 // знайти слово у якому після Box йде ing. Якщо слово знайдено, функція поверне true, якщо ні – false.$ pattern1 = "/Box(?=ing)/" ; preg_match ($ pattern1, "Box Day"); // false preg_match ($ pattern1, "Boxing Day"); // true // знайти слово у якому після box не йде ing. Якщо слово знайдено, функція поверне true, якщо ні – false.$ pattern2 = "/box(?!ing)/" ; preg_match ($ pattern2, "Box for iPhone and iPad"); // true preg_match ($ pattern2, "What is boxing day?"); // false preg_match ($ pattern2, "css-moz-box-shadow"); // true // знайти слово у якому перед ing не йде box. Якщо слово знайдено, функція поверне true, якщо ні – false.$ pattern3 = "/(?

[^<]+?~","seo блог",$text); echo $text; ?>

3) Отримати та вивести значення Alexa Rank заданого сайту.

1 2 3 4 5 6 7 8 9 "#
(.*?)
#si", file_get_contents ( "http://www.alexa.com/siteinfo/($url)") , $ a ) ; return trim (str_replace (",", "", strip_tags ($a [1])))); ) $ alexa = alexa ( $ url ) ; echo $alexa; ?>

(.*?)

#si", file_get_contents("http://www.alexa.com/siteinfo/($url)"), $a); ) $alexa = alexa($url);echo $alexa; ?>

4) Отримати та вивести title сторінки.

1 2 3 4 5 (.*)<\/title>/s" , $str , $m ) ; echo $m [ 1 ] ; ?>

(.*)<\/title>/s", $str, $m); echo $m; ?>

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 \n \r \t ]/", "", $content); // Заміна символів перекладу рядка та табуляції на пробіл$content = preg_replace("/(2,)/", "", $content); // Заміна більше 2х пробілів на один preg_match_all ("/ ]*href=(?:"| \" )(.*)(?:"|\" )[^<>]*>(.*)<\/a>/iU", $content, $links); // Збір посилань if (sizeof ($links [ 1 ] ) > 0 ) // якщо посилання знайдено($out = array(); // масив зовнішніх посилань foreach ($links [ 1 ] as $v ) ( if (preg_match ("/http:\/\/(www\.)(0,1)" . $domain . "/i" , $v ) ) // відсіваємо внутрішні посилання( continue ; ) if ( preg_match ( "/(http:|https:)?\/\/(www\.)(0,1)(.*)/i", $ v ) ) // зовнішнє посилання($out = $v;)) return $out; ) return array (); ) $ domain = "сайт"; $content = file_get_contents ("http://сайт/"); $getoutlinks = getoutlinks($content, $domain); for ($i = 0; $i<= count ($getoutlinks ) ; $i ++ ) { echo $getoutlinks [ $i ] . "
" ; } ?>

]*href=(?:"|\")(.*)(?:"|\")[^<>]*>(.*)<\/a>/iU", $content, $links); // збір посилань if (sizeof($links) > 0) // якщо посилання знайдені ( $out = array(); // масив зовнішніх посилань foreach ($links as $v ) ( if (preg_match("/http:\/\/(www\.)(0,1)".$domain."/i", $v)) // відсіваємо внутрішні посилання ( continue; ) if (preg_match ("/(http:|https:)?\/\/(www\.)(0,1)(..com/"); $getoutlinks = getoutlinks($content, $domain); for ($i = 0;$i<= count($getoutlinks); $i++) { echo $getoutlinks[$i]."
"; } ?>

де:
preg_replace— виконує пошук та заміну за регулярним виразом.
preg_match- Виконує перевірку на відповідність регулярному виразу.
preg_match_all- Шукає всі збіги, в той час як preg_match - тільки перше.
file_get_contents— одержати вміст файлу у вигляді одного рядка.
trim- Видаляє прогалини на початку і кінці рядка.
str_replace- Замінює рядок пошуку на рядок заміни.
strip_tags- Видаляє html і php теги з рядка.
sizeof- Отримує кількість елементів у змінній.
count- Підраховує кількість елементів масиву або кількість властивостей об'єкта.