Учебник по основам PHP




Функции регулярных выражений (PCRE)


pregjnatch

Одиночный регулярный поиск

int pregjnatch (string pattern, string subject [, array matches])

Ищет в тексте, указанном аргументом subject, соответствие шаблону, указанному в pattern. Если совпадение находится, то функция возвращает TRUE, в противном случае — FALSE.

При указании в аргументе matches массива (одномерного) он заполняется найденными фрагментами совпадения. $matches[0] будет содержать фрагмент, совпадающий с полным шаблоном, $matches[l] -совпадение с первым подшаблоном и т. д.

Так как возвращается только одно совпадение, функцию целесообразно использовать исключительно в целях проверки пли в случае, когда множественные совпадения исключены.

if (pregjnatch ("/XX/i". "уу Хх хухх")) { // игнорировать регистр print "Найдено" } else { rint "Безуспешный поиск". if (preg_match C7\bxx\b/i" . "уу Хх лухх")) // искать слово '<хх» print "Найдено": else print "Безуспешный поиск"; preg_match("r(http "http-//www php.net/index.html", Smatches): $host = $matches[2]: //должно содержать: www.php.net // найти имена двух последних доменов сервера preg_match("/r\.\/]-t-\.r\.\/]+$/".$host.$matches): echo "domain name is: ".$matches[0]."\n": // напечатает domain nane is php net

См. также: pregjnatcrall(), preg_replace(), preg_split().

preg_match_all

Полный регулярный поиск

int preg_match_all (string pattern, string subject, array matches [, int order])

Ищет в тексте, указанном аргументом subject, все возможные соответствия шаблону, указанному в pattern. Поиск последующих совпадений производится от места последнего совпадения. Функция возвращает число совпадений с полным шаблоном или FALSE, если совпадений не было (или произошла ошибка).

В аргументе matches указывается массив (двухмерный), который заполняется найденными фрагментами совпадения. Аргумент order определяет вид, в котором сохраняются результаты поиска в массиве matches, и может принимать два значения.

PREG_PATTERN_ORDER (по умолчанию) - в виде [(под)шаб-лон] [фрагмент]. В (под)массиве Smatches[0] сохраняются совпадения с полным шаблоном, в $matches[l] и последующих — совпадения с подшаблонами. preg_match__all ("|<[A>]+>( .*)</[*>]+>|U". "<b>Пример: </b> <div aliqn=left> мой текст </div>", Jout. PREG_PATTERN_ORDER):

Теперь массив Sout будет содержать следующие элементы (общая схема):

   

Фрагменты

   
   

0

1

...

Шаблон

0

$out[0]|0] = "<b>Пример: </b>"

$out[0][l] = "<cliv aligrHeft> мой T6KCT</div>"

$out[0)[...]

Под-шаблоны

1

$out[l][0] = "Пример: "

Sout[l][l] = " мой текст "

$out[l]L-..]

   

$out[...][0]

$out[...][l]

$out[...][...]

PREG_SET_ORDER — в виде [фрагмент] [(под)шаблон]. В (гюд)массивах $matches[0] — $matches[xxx] сохраняются соответствующие фрагменты совпадения.

preg_match_all ("[<[*>]+>(.*)</[">]+>|U". "<b>Пример: </b> <div align-left* мой текст </div>", $out. PREG SET ORDER):

   

Шаблон

Подшаблоны

 
   

0

,

 

Фрагменты

0

$out[0][0] =•

"<b>Пример:

</b>"

$out[0][l] = "Пример: "

$out(0][...J

 

1

$out[l][0] -

"<div align=lefl> мой текст </div>"

$put[lj[l]-" мой текст "

$out[l]|...|

 

...

$out[...][0]

$out [...][!]

$out[...][...]

//Пример 1. Получение телефонного номера. preg_match_all t"/\(? (\d{3.6})? \)?

(?(1) [\-\s] ) \d{3}-\d{4}/x". "Call 555-1212 or 1-800-555-1212", Sphones). // Пример 2. Искать парные HTML теги (жадно) // \\2 - ссылка, здесь на t[\wj+) Shtml = "<b>bold text</b>--a href=howdy.htrol>click me</a> preg_match_dll ("/(<([\w]+)[*>]*>K.*)(<\/\\2>)/". Shtnl. Sratches); for ($i=0. $i< count($inatches[0]). $i++) { echo "фрагмент: " $matches[0][$i] "\n". "часть 1 " $matches[l][$i] "\n". "часть 2: ".$matches[3][$i]."\n". "часть 3: ".$matches[4][$i]."\n\n". } После запуска примера будет выведено:

фрагмент: <b>bold text</b> часть 1 <b>

часть 2: bold text часть 3: </b> фрагмент: <а href=howdy.html> click me<@060>/a> часть1: <а href=howdy.html> часть 2: click me часть 3 </а>

См. также: preg_match(), preg_replace(), preg_split().

preg_replace

Регулярный поиск с заменой

mixed preg_replace (mixed pattern, mixed replacement, mixed subject [, int limit])

Ищет в тексте subject вес фрагменты, соответствующие шаблону pattern, и заменяет их на replacement. Возвращает измененный текст. Если совпадений не находится, то возвращается неизмененный текст subject. Аргумент limit указывает, сколько фрагментов надо заменить; если он не указан или равен -1, то заменяются все найденные фрагменты.

replacement может содержать обратные ссылки (обычные для регулярных выражений) в форме \\п или, что более предпочтительно, в форме $п. Каждая такая ссылка будет заменяться на фрагмент исходного текста, соответствующий указанному подшаблону. Обычно n может быть от 0 до 99 и \\0 или $0 соответствует целому шаблону.

Каждый аргумент (кроме limit) может быть массивом. В простейшем случае к массиву с текстом применяются единые шаблон и замена (возвращается соответствующий массив). Возможно применение к одному тексту набора шаблонов и заместителей. Если в массиве replacement недостаточно элементов, то вместо них используются пустые строки; если аргумент replacement — строка, то она используется для всех элементов. Сходные комбинации возможны, но едва ли полезны.

Наиболее мощной возможностью функции является возможность использования в регулярном выражении pattern модификатора е. Это заставляет функцию обрабатывать текст замещения replacement как PHP-код (в котором также возможно использовать ссылки). Но не забывайте, что тогда код должен соответствовать всем синтаксическим правилам РНР, иначе будет спровоцирована ошибка.

//Пример 1 Spatterns = array ("/(19|20)(\d{2}) -(\d{1.2})-(\d{1.2})/". "r\s*{(\w+)}\s*=/"): $r-eplace = array ("\\3/\\4/\\l\\2". "$\U ="); print preg_replace (Spatterns, Sreplace. "{startDate} = 1984-5-27"); //напечатает: SstartDate = 5/27/1984 // Пример 2. «использование модификатора /е» // делает все HTML теги заглавными preg_replace ("/(<V)(\w+)([">]*>)/e". "\\Г .strtoupper('\\2') '\\3'", $html_body); // Пример 3. Преобразование HTML в текст // Sdocument должен содержать текст HTML. // Удаляются теги HTML tags, секции javascript // пробелы 8 начале строк. Подстановки HTML конвертируются // в их символьное представление. $search = array C"<scnpt[*>]*?> *? </scnpt»'sn". // Вырезать javascript "<[\Л!]*?[Ж<>]*?>'51". // Вырезать теги html "' ([\r\n])[\s]+'". // Вырезать начальные пробелы "'&(quot|#34);'т", // Заменить html entities "'&(amp||38).'V. '"&(lt|#60):'i". "'&(gt|#62): '-!". '"&(nbsp|#160):'i". '"Sdexcllfien.1!" . '"&(cent|fl62);'i". '"&(pound|#163);'i". '"&(copy|#169);'i". "'&#(\d+).'e"): // обработать php кодом Sreplace = array ("". "\\1", "\"". "&". 11 <" M>". chr(161). chr(162). chr(163). chr(169). "chr(\\l)"): Stext = preg_replace (Ssearch. Sreplace. Sdocument).

См. также: pregjnatch(), preg_match_all(), preg_split().

preg_split

Нарезка регулярным выражением

array preg_split (string pattern, string subject [,

int limit [, int flags]])

Возвращает массив, содержащий части текста subject, находящиеся между фрагментами, соответствующими шаблону pattern.

Аргументом limit можно указать число элементов в возвращаемом массиве.

При указании в аргументе flags значения PREG_SPLIT_NO_EMPTY в возвращаемом массиве не сохраняются пустые значения.

// Разделить текст пробельными символами или запятыми Skeywords = preg_split ("/[\s.]+/". "hypertext language, programming"); // разделить строку на составляющие символы $str = 'ноя string'; $chars = preg_split('//'. $str. 0. PREG_SPLIT_NO_FMPTY): print_r($chars):

См. также: preg_match(), pregjnatch_al 1 (), preg_replace().

preg_quote

Цитирование метасимволов регулярного выражения

string preg_quote (string str [, string delimiter])

Возвращает строку str, и которую вставлены слеши перед каждым символом, являющимся метасимволом в регулярных выражениях. Это бывает полезно, когда во время исполнения необходимо создать шаблон для поиска в тексте фрагмента, который может содержать специальные символы.

Метасимволами регулярных выражений считаются: .Л\ + *?[*]$(){}-! <> .| :

В аргументе delimiter можно указать перечисление дополнительных символов, которые следует предварять слешем (обычно здесь полезно указать ограничитель шаблона).

Skeywords = "$40 за дЗ/400"; Skeywords = preg_quote (Skeywords. "/"); echo $keywords. // возвращает: \$40 for a g3\/400 // Выделение курсивом слова в тексте HTML, помеченного звездочками Stextbody = "Это *очснь* сложное выражение.". Sword = "*очень*": Stextbody •= preg_replace ("/(".preg_quote(Sword) ")/". "<-,>$1</1>". Stextbody);

preg_grep

фильтрация элементов массива в соответствии с шаблоном

array preg_grep (string pattern, array input)

Возвращает массив input, в котором оставлены только элементы, соответствующие указанному pattern шаблону.

// возвращает все элементы, содержащие
дробные числа $f1 array =
preg_grep ("/~(\d+)?\ \d+$/". $arra;y)









Начало    Назад    Вперед




Книжный магазин