Содержание

preg_replace — Выполняет поиск и замену по регулярному выражению | Руководство по PHP

Строка или массив строк для замены. Если этот параметр является
строкой, а pattern является массивом,
все шаблоны будут заменены этой строкой. Если и
pattern и replacement
являются массивами, каждый элемент pattern будет
заменен соответствующим элементом из replacement.
Если массив replacement содержит меньше
элементов, чем массив pattern, то все
лишние шаблоны из pattern будут
заменены пустыми строками.

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

При замене по шаблону с использованием ссылок на подмаски
может возникнуть ситуация, когда непосредственно за маской
следует цифра (например, установка цифры сразу после совпавшей маски).
В таком случае нельзя использовать знакомую нотацию вида
\\1 для ссылки на подмаски.
Запись, например, \\11, смутит
preg_replace(), так как она не сможет понять,
хотите ли вы использовать ссылку \\1, за
которой следует цифра 1 или же вы хотите
просто использовать ссылку \\11, за которой
ничего не следует. Это недоразумение можно устранить, если
воспользоваться конструкцией \${1}1,
использующей изолированную ссылку $1, и
следующую за ней цифру 1.

При использовании устаревшего модификатора e эта
функция экранирует некоторые символы (а именно
, «,
\ и NULL) в строках, замещающих обратные
ссылки. Это сделано для удостоверения корректности синтаксиса
при использовании обратных ссылок внутри одинарных или двойных
кавычек (например, ‘strlen(\’$1\’)+strlen(«$2»)’).
Убедитесь, что вы владеете синтаксисом
обработки строк PHP для того, чтобы точно осознавать,
как будет выглядеть интерпретированная строка.

Поиск, обработка и замена текста между тегами на PHP

Сегодня возникла задача обработки уведомлений по шаблону с ключевыми словами. К примеру «Здравствуйте [[name]]!». Где name нужно заменить на имя пользователя в письме.

Нашел статью…

Сегодня я постараюсь объяснить как найти, обработать и заменить текст между тегами используя PHP функции. На первый взгляд простая задача, тем более в PHP есть специально предназначенные для этого функции, позволяющие использовать для поиска и замены регулярные выражения. Чтобы было проще разобраться, будем все делать на примерах. За основу возьмем абстрактный html код:

<xx>наташа</xx> ... <xx>даша</<xx>настя</

Здесь <xx> — представляет какой-то конкретный html тег, а троеточие — другие произвольные теги. Предлагаю постепенно начинать разбираться с возможностями PHP по работе со строками. Все пункты будем рассматривать на примерах.

Поиск текста функцией «preg_match_all»

Для поиска текста внутри тегов воспользуемся функцией «preg_match_all». Зададим маску поиска и посмотрим, что она возвращает в качестве результата.

$sContent "... <xx>наташа</xx> ... <xx>даша</xx> ... <xx>настя</xx> ..."preg_match_all'|<xx>(.+)</xx>|isU' $sContent 

  echo $arr"<br />"
  echo $arr//на выходе получаем://<xx>наташа</xx> <xx>даша</xx> <xx>настя</xx>//наташа даша настя

В нулевой разряд массива записались значения с тегами, а в первый — только текст между ними. Если требуется вывести все найденные результаты, то лучше всего использовать цикл foreach, его рассмотрим ниже, а пока немного информации про функцию preg_match_all.

Она возвращает либо «1», в случае нахождения в тексте соответствия с указанной маской или «0» если соответствий не найдено. В качестве параметров функция принимает маску поиска, строковую переменную в которой будет осуществляться поиск и переменную типа двухмерный массив, в который будут записываться найденные совпадения.

|<>(.+)</>|

Маска поиска текста между тегов обрамляется символом «|». Таких правил в маске может быть несколько. Для нашей задачи достаточно одного.

В правиле у нас содержатся теги, между которыми требуется заменить текст — «(.+)». Регулярное выражение указывает на то, что между ними может быть любое количество любых символов. Знак плюс означает что их должно быть больше нуля. То есть, если между тегами ничего нет, то результата никакого не получим. Если хотим найти даже те места, где между тегов нет никакого текста, то вместо плюса ставим знак звёздочки — «*». Директива «isU» обозначает регистронезависимый поиск в многострочном тексте кодировки «UTF-8».

Перебор найденных результатов в цикле «foreach»

Для вывода всех результатов поиска лучше всего воспользоваться циклом «foreach».

$sContent "... <xx>Наташа</xx> ... <xx>Марина</xx> ... <xx>Настя</xx> ..."preg_match_all'|<xx>(.+)</xx>|isU' $sContentforeach $value echo $value"<br/>"foreach $value echo $value

На выходе получаем тоже самое что и в предыдущем примере, зато теперь мы автоматизировали перебор массива и сократили код.

Отличие «preg_match» от «preg_match_all»

Разница заключается в том, что «preg_match» ищет только до первого совпадения с маской поиска. Как только что-то найдено, поиск останавливается. Так же разница в выдаваемом результате. «preg_match» возвращает одномерный массив. Вот пример.

preg_match'|<title>(.+?)</title>|isU' $sContentreturnreturnfalse

В этом случае нулевой элемент массива «$arr» содержит найденное совпадение вместе с тегами «title», а первый элемент — «$arr[1]» только текст между этими тегами. И не путайте, если в искомом коде несколько тегов «title», это не значит что остальные значения будут записаны в «$arr[2]» и так далее. В случае с «preg_match» поиск идет только до первого найденного совпадения, а элемент «$arr[2]» окажется не пуст, только если в маске указано несколько правил, но об этом в следующий раз.

Замена текста между тегами функцией «preg_replace»

Если требуется не просто найти, но ещё и произвести замену найденных элементов в строке, то на помощь приходит PHP функция «preg_replace».

Давайте заменим в нашем примере все имена между тегами на какое-то конкретное, например — «Оля».

$sContent "<xx>наташа</xx> ... <xx>даша</xx> ... <xx>настя</xx>"
$sContent  preg_replace'|(<xx>)(.+)(</xx>)|isU'"Оля"$sContent

Замена тегов, оставляя всё, что находится внутри

А теперь небольшой пример, показывающий как заменить определенные теги, сохранив при этом содержимое между ними. Допустим, надо изменить в html коде все «strong» на CSS форматирование.

$sContent "... <strong>Настя</strong> ..."

$sContent  preg_replace'|<strong(.*)strong>|isU''<span $1span>' $sContent//на выходе получаем $sContent://... <span >Настя</span> ...

Обработка и замена при помощи «preg_replace_callback»

А теперь переходим к самому интересному. Что делать, если нужно над найденным фрагметом произвести какие-то действия и только потом осуществить замену? Конечно же использовать «preg_replace_callback». Для примера рассмотрим как в именах сделать первую букву заглавной.

<html><head><metacharset"UTF-8"</head><body><?php 
$sContent "<xx>наташа</xx> ... <xx>даша</xx> ... <xx>настя</xx>"

echo htmlspecialchars$sContent"<br />"

$sContent  preg_replace_callback'|(<xx>)(.+)(</xx>)|iU'function$matches
	$matches mb_substrmb_strtoupper$matches'UTF-8''UTF-8'substr$matchesreturn $matches$matches$matches$sContent

echo htmlspecialchars$sContent?></body></html>

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

Переменная «$matches» это массив, содержащий элементы регулярного выражения. В нулевом элементе будет содержаться вся исходная строка, а в остальных — содержимое скобок.

Код обработки не буду описывать, отмечу что для замены первой буквы на заглавную я использую PHP функции для работы со строками в UTF-8 кодировке. Если у вас кодировка cp1251, то нужно отбросить префикс «mb_» и удалить последний параметр у функций.

ВНИМАНИЕ! Код в примере будет работать только при использовании PHP версии 5.3 и выше. Для более поздних версий требуется доработка.

Использование нумирации в заменах и другие продвинутые возможности

Теперь немного о продвинутых возможностях функции «preg_replace_callback». Ранее я упоминал что у неё есть два необязательных параметра. Первый (по умолчанию равен «-1») содержит максимальное количество замен, которое должна произвести функция. Второй — переменная, в которую будет записано количество произведенных замен.

$sContent  preg_replace_callback'|(<xx>)(.+)(</xx>)|iU'function$matches//тут код }$sContent$count

Задав эти два параметра в предыдущем примере, замена главной буквы будет произведена только у первых двух имён. Соответственно, переменная «$count» будет содержать — 2. Если установить первый дополнительный параметр в «-1», то «$count» будет — 3.

И в конце о том как узнать какая по счету замена происходит в данный момент. Это может потребоваться если появилась необходимость произвести замену между пятым и десятым найденным элементом строки или требуется для каких-то тегов прописать уникальные идентификаторы.

Для такой реализации может быть использована глобальная или статическая переменная. Использование глобальных переменных может быть отключено в PHP, поэтому рассмотрим пример со статической переменной. Присвоим всем тегам h3 уникальный идентификатор.

<?php
$str '<h3>Марина</h3> <b>Алёша</b> <h3>Наташа</h3> <h3>Катя</h3>' preg_replace_callback'|<h3>(.|:)([0-9a-fA-F]{0,4})){1,8}$/i", $text)) {
	echo 'yes';
} else {
	echo 'no';
}

Переход на PHP7: работа над ошибками

Итак, у вас есть старенький, но уж очень милый сердцу сайт, который вы решаетесь из жалости (или, возможно, перечитав Хабра) перевести на PHP7. С волнением ожидая резкого роста производительности, вы смахиваете пыль с бедного сайта и решительно переключаете в панели управления хостингом версию PHP.

Если сайт уже давно не молод, то с большой долей вероятности чудо не произойдет. В лучшем случае начнут появляться разного рода ошибки, а в худшем  — вы увидите белый экран, дзен веб-разработки. В этот момент хочется по-быстрому переключить все обратно и забыть о своей внезапной слабости.

Но предположим, что ваша сильная сторона — настойчивость, к тому же вы располагаете некоторым количеством времени для экспериментов. Давайте попробуем все починить.

Резервные копии

Делаем резервные копии сайта (а заодно и баз данных). Ведь кто не делает резервные копи — сам себе враг, верно? Для разного рода экспериментов имеет смысл добавить еще один сайт на хостинге и скопировать в него файлы, которые мы сейчас будем править.

Журналы ошибок

Настроим ведение журнала ошибок PHP в файл .htaccess (если он не был настроен ранее):

php_value display_errors 0
php_value log_errors 1
php_value error_log /home/vasya/domains/mysite.ru/logs/error.log

Подробно о ведении журналов мы уже писали в нашем блоге ранее.

Работа с MySQL

Допустим, сайт использует базы данных, и вы видите ошибки вроде такой:

Fatal error: Uncaught Error: Call to undefined function mysql_connect()

Это оттого, что в современных версиях PHP (начиная с PHP 5.5.0) оригинальное расширение MySQL не поддерживается. Разработчики рекомендуют использовать MySQLi или PDO. Попробуем перейти на MySQLi, это просто:

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

$link = mysql_connect(‘localhost’, $user, $password)
mysql_select_db($dbname, $link)
mysql_query(‘set names cp1251’)

можно заменить на:

$link = mysqli_connect(‘localhost’, $user, $password, $dbname)
mysqli_query($link, ‘set names cp1251’)

для запросов:

$result=mysql_query($query,$cid)

заменить на:

$result=mysqli_query($cid, $query)

Другие популярные функции легко меняются на их аналоги с буквой ‘i’:

mysqli_fetch_array()
mysqli_fetch_row()
mysqli_fetch_assoc()
mysqli_fetch_array()
mysqli_num_rows()
mysqli_insert_id()
mysqli_close()

В результате этих несложных действий данные из БД должны успешно собираться и отправляться.

Кодировка

Настоящий олдскул — это сайт в CP1251 (как минимум). Всё превратилось в  ромбики или прочие козяблики?

Скорее всего, достаточно будет указать кодировку в .htaccess таким образом:

php_value default_charset «cp1251»

Регулярные выражения

Также вы можете наблюдать ошибки следующего рода:

Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead

Это означает, что модификатор /e, который позволял передать произвольной функции результат регулярного выражения, теперь не поддерживается. В таких случаях рекомендуется использовать функцию preg_replace_callback

Допустим, у нас есть такое регулярное выражение:

$string=preg_replace(«/:([a-z]{1,10}):/e», «print_smile(‘\\1’)», $string)

с заменой на preg_replace_callback оно должно выглядеть вот так:

$string=preg_replace_callback(«/:([a-z]{1,10}):/», create_function(‘$matches’, ‘return print_smile($matches[1])’), $string)

здесь все просто, регулярное выражение теперь указывается в качестве первого аргумента (без модификатора /e, разумеется), а в качестве второго аргумента указывается анонимная функция (которая будет выполнена после применения регулярного выражения) с двумя аргументами: массив $matches, где будут сохранены данные, совпадающие с регулярным выражением и вызов внешней функции с аргументами. В данном примере внешняя функция называется print_smile и ей передается аргументом первое найденное вхождение. То, что в preg_replace было \\1 (первое найденное вхождение) станет $matches[1] (если аргументов было больше, то будет $matches[2], $matches[3] и так далее).

Вот еще один пример, посложнее:

Было так:

$out=preg_replace(«/<[Rr][Mm]( [Mm][Ss][Gg]=[\’\»]{0,1}|)(.*?)([\’\»]{0,1})>(.*?)<\/[Rr][Mm]>/es», «feed_out_sub_rm(‘\\2′,’$base_prefix’,’$nick’,’$id_entry’)», $out)

Стало вот так:

$out=preg_replace_callback(‘/<[Rr][Mm]( [Mm][Ss][Gg]=[\’\»]{0,1}|)(.*?)([\’\»]{0,1})>(.*?)<\/[Rr][Mm]>/s’, create_function(‘$matches’, ‘return feed_out_sub_rm($matches[2], «‘.$base_prefix.’», «‘.$nick.’», «‘.$id_entry.’»)    ‘), $out)

здесь легко запутаться в кавычках, будьте внимательны.

Копаясь в регулярных выражениях, можно вспомнить еще про две функции, которые с версии PHP 5.3.0 считаются устаревшими (и не поддерживаются). Симптомы следующие:

Fatal error: Uncaught Error: Call to undefined function ereg_replace()

Если регулярное выражение в ereg_replace простое, то можно обойтись просто установкой граничных символов, как здесь:

$str=ereg_replace(«[\r\t\n]»,»»,$str)
$str=preg_replace(«/[\r\t\n]/»,»»,$str)

Аналогичный симптом:

Fatal error: Uncaught Error: Call to undefined function split()

Было:

$var_pair=split(«=»,$tmp[3])

Стало:

$var_pair=explode(«=»,$tmp[3])

Если регулярное выражение посложнее, то пробуем преобразовать к preg_split.

На этом пока все. Удачной отладки.
Много полезных материалов по теме можно найти на сайте разработчиков.

Если что-то не получается, или ваш случай совсем не похож на наши примеры — пишите комментарии, попробуем разобраться вместе.?]+)(\?.*?)?(#.*)?$/’, ‘$1$3’, $url);
}

Замена содержимого GET-параметров.

Нередко требуется, имея адрес страницы, добавить к нему какой-нибудь GET-запрос. Как правило, это делается простым дописыванием к адресу строки вида ?имя_переменной=значение. Однако не всегда бывает заранее известно, не содержит ли уже адрес какого-нибудь GET-запроса — если вдруг содержит, то простое дописывание приведет к адресу, содержащему два знака вопроса (вида ‘?имя1=значение1?имя2=значение2’) и потому некорректному, что приводит к необходимости на этот счет строку адреса специально проверять.

Еще более сложная ситуация возникает в случае, когда в URL уже может находиться нужный к передаче GET-параметр (т.е. с тем же именем) — в этом случае нужно даже не просто корректно дописать адрес, а найти там нужную переменную и переписать её значение. Например, было

/article.php?view=flat&page=3&mode=1#note_1

, а нужно

/article.php?view=flat&page=4&mode=1#note_1

Все эти задачи может решить функция sgp():

$url = ‘/article.php?view=flat&page=3&mode=1#note_1’;
echo sgp($url, ‘page’, 4); // выведет ‘/article.php?view=flat&page=4&mode=1#note_1’
echo sgp($url, ‘view’, ‘tree’); // выведет ‘/article.php?view=tree&page=3&mode=1#note_1’
echo sgp($url, ‘view’, »); // выведет ‘/article.php&page=3&mode=1#note_1’

За один вызов функции можно менять и несколько переменных:

sgp(
        $url,
        array(‘page’, ‘view’),
        array(4, ‘normal’)
    ); // ..?view=normal&page=4&mode=1#note_1
   
sgp(
        $url,
        array(‘page’, ‘view’),
        NULL // или просто опустить третий аргумент
    ); // ..?mode=1#note_1

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

function sgp($url, $varname, $value) // substitute get parameter
{
     if (is_array($varname)) {
         foreach ($varname as $i => $n) {
            $v = (is_array($value))
                  ? ( isset($value[$i]) ? $value[$i] : NULL )
                  : $value;
            $url = sgp($url, $n, $v);
         }
         return $url;
     }
     
    preg_match(‘/^([^?]+)(\?.?]+)(\?.*?)?(#.*)?$/’, $url, $matches);
$gp = (isset($matches[2])) ? $matches[2] : »; // GET-parameters

Если GET-параметры отсутствуют — заменять негде, переданный адрес заведомо останется неизменным и его можно сразу вернуть, завершив работу функции:

if (!$gp) return $url;

Далее нужно сконструировать регулярное выражение, описывающее указание в адресе на данную переменную GET-запроса. Это регулярное выражение должно ловить строку вида имя_переменной=значение, которой предшествует знак вопроса или амперсанд, и вслед за которой следует конец строки (самый, наверное, частый случай), амперсанд (если начинается объявление следующей GET-переменной) или же решётка (если адрес содержит якорь):

$pattern = «/([?&])$varname=.*?(?=&|#|\z)/»;

Далее логика программы такая: если функции передается новое значение переменной, то производится замена старого значения на новое (при этом используется фрагмент строки, захваченный первой подмаской — это будет знак вопроса или амперсанд). Если же новое значение переменной — ни что иное, как пустая строка, то следует совсем исключить упоминание об этой переменной из строки запроса (т.е. получить адрес даже не вида /adress.php?v1=&v2=asdf, а просто /adress.php?v2=asdf).
Такое поведение не является полностью строгим, поскольку может приводить к изменению количества передаваемых параметров GET-запроса, однако, автор считает такой вариант работы наиболее удобным, т.к. при этом происходит также очищение запроса от пустых переменных, которые в большинстве случаев являются просто мусором:

$substitution = ($value !== ») ? «\${1}$varname=» . preg_quote($value) : »;
$newgp = preg_replace($pattern, $substitution, $gp); // new GET-parameters

Нужно не забывать и о ситуации, в которой переменная запроса, которую решили убрать, следовала в запросе первой. В таком случае из адреса вида /adress.php?v1=&v2=asdf&v3=1 получится некорректный адрес: /adress.php&v2=asdf&v3=1. В этом адресе первый амперсанд нужно заменить на знак вопроса, а поскольку располагаем мы не только целым адресом, но и отдельно строкой его GET-запроса (в примере — &v2=asdf&v3=1), сделать это особенно легко:

$newgp = preg_replace(‘/^&/’, ‘?’, $newgp);

Если оказалось, что URL не содержит упоминания данной переменной, нужно эту переменную в него дописать, причем сделать это корректно: если URL вовсе не содержит GET-запроса (в этом случае переменная $gp будет содержать пустую строку), декларация переменной должна начинаться со знака вопроса, в противном случае — с амперсанда:

$s = ($gp) ? ‘&’ : ‘?’;

Далее окончательно формируем обновленную строку GET-запроса:

$newgp = $gp.$s.$varname.’=’.$value;

Обрабатываем возможное наличие якоря:

$anchor = (isset($matches[3])) ? $matches[3] : »;

И, наконец, конструируем конечный адрес полностью, дописывая статическую часть адреса страницы и якорь, после чего возвращаем полученный результат:

$newurl = $matches[1].$newgp.$anchor;
return $newurl;

Следует отметить, что эту задачу можно решить и без интенсивного использования регулярных выражений:

function sgp(
        $url,
        $varname,
        $value = NULL, // если NULL — убираем переменную совсем
        $clean = TRUE // превращать ли ?one=&two=
    ) {              // в ?one&two (так адрес красивее)
   
    // Версия функции «substitue get parameter» без регулярных выражений
   
    if (is_array($varname)) {
        foreach ($varname as $i => $n) {
            $v = (is_array($value))
                 ? ( isset($value[$i]) ? $value[$i] : NULL )
                 : $value;
            $url = sgp($url, $n, $v, $clean);
        }
        return $url;
    }
   
    $urlinfo = parse_url($url);
   
    $get = (isset($urlinfo[‘query’]))
           ? $urlinfo[‘query’]
           : »;
   
    parse_str($get, $vars);
   
    if (!is_null($value))        // одновременно переписываем переменную
        $vars[$varname] = $value; // либо добавляем новую
    else
        unset($vars[$varname]); // убираем переменную совсем
       
    $new_get = http_build_query($vars);
   
    if ($clean)
        $new_get = preg_replace( // str_replace() выигрывает
                ‘/=(?=&|\z)/’,     // в данном случае
                »,                // всего на 20%
                $new_get
            );
   
    $result_url =   (isset($urlinfo[‘scheme’]) ? «$urlinfo[scheme]://» : »)
                  . (isset($urlinfo[‘host’]) ? «$urlinfo[host]» : »)
                  . (isset($urlinfo[‘path’]) ? «$urlinfo[path]» : »)
                  . ( ($new_get) ? «?$new_get» : »)
                  . (isset($urlinfo[‘fragment’]) ? «#$urlinfo[fragment]» : »)
                  ;
    return $result_url;
}

Версия без регулярных выражений работает где-то на треть быстрее, однако эта разница не чувствуется, поскольку общее время работы очень мало (1000 итераций выполняются за сотые доли секунды).


© Все права на данную статью принадлежат порталу webew.ru.
Перепечатка в интернет-изданиях разрешается только с указанием автора
и прямой ссылки на оригинальную статью. Перепечатка в печатных
изданиях допускается только с разрешения редакции.

Использование регулярных выражений в PHP

PHP — это язык с открытым исходным кодом для создания динамических веб-страниц. В PHP есть три набора функций, которые позволяют работать с регулярными выражениями.

Самый важный набор функций регулярных выражений начинается с preg. Эти функции представляют собой оболочку PHP вокруг библиотеки PCRE (Perl-совместимые регулярные выражения). Все, что говорится о разновидности регулярных выражений PCRE в руководстве по регулярным выражениям на этом веб-сайте, применимо к функциям preg PHP.Когда в руководстве конкретно говорится о PHP, предполагается, что вы используете функции preg. Вы должны использовать функции preg для всего нового кода PHP, который использует регулярные выражения. PHP включает PCRE по умолчанию, начиная с PHP 4.2.0 (апрель 2002 г.).

Самый старый набор функций регулярных выражений — это те, которые начинаются с ereg. Они реализуют расширенные регулярные выражения POSIX, такие как традиционная команда egrep UNIX. Эти функции в основном предназначены для обратной совместимости с PHP 3. Они официально объявлены устаревшими с PHP 5.3.0. Многие из более современных функций регулярных выражений, такие как ленивые квантификаторы, поиск и Unicode, не поддерживаются функциями ereg. Не позволяйте «расширенному» прозвищу ввести вас в заблуждение. Стандарт POSIX был определен в 1986 году, и с тех пор регулярные выражения прошли долгий путь.

Последний набор представляет собой вариант набора ereg с префиксом mb_ для «многобайтовых» имен функций. В то время как ereg обрабатывает регулярное выражение и строку темы как серию 8-битных символов, mb_ereg может работать с многобайтовыми символами из различных кодовых страниц.Если вы хотите, чтобы ваше регулярное выражение рассматривало символы Дальнего Востока как отдельные символы, вам нужно будет использовать либо функции mb_ereg, либо функции preg с модификатором / u. mb_ereg доступен в PHP 4.2.0 и новее. Он использует тот же аромат POSIX ERE.

Набор функций preg

Все функции preg требуют, чтобы вы указали регулярное выражение в виде строки с использованием синтаксиса Perl. В Perl / regex / определяет регулярное выражение. В PHP это становится preg_match (‘/ regex /’, $ subject).Когда в качестве разделителя регулярных выражений используются косые черты, любые косые черты в регулярном выражении должны быть экранированы обратной косой чертой. Таким образом, http: // www \ .jgsoft \ .com / становится ‘/http:\/\/www\.jgsoft\.com\//’. Как и Perl, функции preg допускают использование любых не буквенно-цифровых символов в качестве разделителей регулярных выражений. Регулярное выражение URL было бы более читабельным как «% http: // www \ .jgsoft \ .com /%» с использованием знаков процента в качестве разделителей регулярных выражений, поскольку в этом случае вам не нужно избегать косой черты. Вам нужно будет избежать процентных знаков, если регулярное выражение их содержит.

В отличие от языков программирования, таких как C # или Java, PHP не требует экранирования всех обратных косых черт в строках. Если вы хотите включить обратную косую черту в качестве буквального символа в строку PHP, вам нужно только экранировать ее, если за ней следует другой символ, который необходимо экранировать. В строках с одинарными кавычками нужно экранировать только одинарные кавычки и обратную косую черту. Вот почему в приведенном выше регулярном выражении мне не нужно было удваивать обратную косую черту перед буквальными точками. Регулярное выражение \\ для соответствия одиночной обратной косой черте станет ‘/ \\\\ /’ в качестве строки preg PHP.Если вы не хотите использовать интерполяцию переменных в своем регулярном выражении, вы всегда должны использовать строки в одинарных кавычках для регулярных выражений в PHP, чтобы избежать беспорядочного дублирования обратных косых черт.

Чтобы указать параметры сопоставления регулярных выражений, такие как нечувствительность к регистру, задаются так же, как в Perl. ‘/ regex / i’ применяет регистр регулярных выражений без учета регистра. ‘/ regex / s’ заставляет точку соответствовать всем символам. ‘/ regex / m’ заставляет привязки начала и конца строки соответствовать встроенным символам новой строки в строке темы.’/ regex / x’ включает режим свободного интервала. Вы можете указать несколько букв, чтобы включить несколько параметров. ‘/ regex / misx’ включает все четыре параметра.

Специальная опция — это / u, которая включает режим сопоставления Unicode вместо 8-битного режима сопоставления по умолчанию. Вы должны указать / u для регулярных выражений, которые используют \ x {FFFF}, \ X или \ p {L} для соответствия символам Unicode, графемам, свойствам или скриптам. PHP интерпретирует ‘/ regex / u’ как строку UTF-8, а не как строку ASCII.

Как и функция ereg, bool preg_match (шаблон строки, тема строки [, группы массивов]) возвращает ИСТИНА, если шаблон регулярного выражения соответствует строке темы или части строки темы.Если вы укажете третий параметр, preg сохранит подстроку, соответствующую первой группе захвата, в $ groups [1]. $ groups [2] будет содержать вторую пару и так далее. Если шаблон регулярного выражения использует именованный захват, вы можете получить доступ к группам по имени с помощью $ groups [‘name’]. $ groups [0] проведут общий матч.

int preg_match_all (шаблон строки, тема строки, совпадения массива, флаги int) заполняет массив «совпадений» всеми совпадениями шаблона регулярного выражения в строке темы.Если вы укажете PREG_SET_ORDER в качестве флага, тогда $ match [0] будет массивом, содержащим совпадение и обратные ссылки первого совпадения, точно так же, как массив $ groups, заполненный preg_match. $ match [1] содержит результаты второго совпадения и так далее. Если вы укажете PREG_PATTERN_ORDER, тогда $ match [0] будет массивом с полными последовательными совпадениями регулярных выражений, $ match [1] массивом с первой обратной ссылкой из всех совпадений, $ match [2] массивом со второй обратной ссылкой каждого совпадения, пр.

array preg_grep (шаблон строки, субъекты массива) возвращает массив, содержащий все строки в массиве «субъектов», которые могут быть сопоставлены шаблоном регулярного выражения.

смешанный preg_replace (смешанный шаблон, смешанная замена, смешанный предмет [, int limit]) возвращает строку, в которой все совпадения с шаблоном регулярного выражения в строке темы заменены строкой замены. Производятся не более лимитные замены. Одно из ключевых отличий заключается в том, что все параметры, кроме limit, могут быть массивами, а не строками. В этом случае preg_replace выполняет свою работу несколько раз, одновременно перебирая элементы в массивах. Вы также можете использовать строки для одних параметров и массивы для других.Затем функция будет перебирать массивы и использовать одни и те же строки для каждой итерации. Использование массива шаблона и замены позволяет выполнять последовательность операций поиска и замены в одной строке темы. Использование массива для строки темы позволяет выполнять одну и ту же операцию поиска и замены для многих строк темы.

preg_replace_callback (смешанный шаблон, замена обратного вызова, смешанный объект [, ограничение int]) работает так же, как preg_replace, за исключением того, что второй параметр принимает обратный вызов вместо строки или массива строк.Функция обратного вызова будет вызываться для каждого совпадения. Обратный вызов должен принимать один параметр. Этот параметр будет массивом строк, в котором элемент 0 содержит общее совпадение регулярного выражения, а другие элементы — текст, сопоставленный захваченными группами. Это тот же массив, что и в preg_match. Функция обратного вызова должна возвращать текст, которым следует заменить совпадение. Верните пустую строку, чтобы удалить совпадение. Верните $ groups [0], чтобы пропустить это совпадение.

Обратные вызовы

позволяют выполнять мощные операции поиска и замены, которые нельзя выполнить с помощью одних только регулярных выражений.Например. если вы ищете регулярное выражение (\ d +) \ + (\ d +), вы можете заменить 2 + 3 на 5, используя обратный вызов:

 function regexadd ($ groups) {
  вернуть $ groups [1] + $ groups [2];
} 

array preg_split (шаблон строки, string subject [, int limit]) работает так же, как split, за исключением того, что он использует синтаксис Perl для шаблона регулярного выражения.

См. Руководство по PHP для получения дополнительной информации о наборе функций preg

.

Набор функций ereg

Функции ereg требуют, чтобы вы указали регулярное выражение в виде строки, как и следовало ожидать.ereg (‘regex’, «subject») проверяет соответствие регулярного выражения subject. При передаче регулярного выражения в виде буквальной строки следует использовать одинарные кавычки. Некоторые специальные символы, такие как доллар и обратная косая черта, также являются специальными символами в строках PHP с двойными кавычками, но не в строках PHP с одним кавычком.

int ereg (шаблон строки, тема строки [, группы массивов]) возвращает длину совпадения, если шаблон регулярного выражения соответствует строке темы или части строки объекта, или ноль в противном случае.Поскольку ноль оценивается как False, а ненулевое значение — как True, вы можете использовать ereg в операторе if для проверки совпадения. Если вы укажете третий параметр, ereg сохранит подстроку, совпадающую с частью регулярного выражения между первой парой круглых скобок в $ groups [1]. $ groups [2] будет содержать вторую пару и так далее. Обратите внимание, что круглые скобки только для группировки не поддерживаются ereg. ereg чувствителен к регистру. eregi — эквивалент без учета регистра.

строка ereg_replace (шаблон строки, замена строки, тема строки) заменяет все совпадения шаблона регулярного выражения в строке темы на заменяющую строку.Вы можете использовать обратные ссылки в строке замены. \\ 0 — это полное совпадение регулярного выражения, \\ 1 — первая обратная ссылка, \\ 2 — вторая и т. Д. Максимально возможная обратная ссылка — \\ 9. ereg_replace чувствителен к регистру. eregi_replace — эквивалент без учета регистра.

array split (string pattern, string subject [, int limit]) разбивает предметную строку на массив строк с использованием шаблона регулярного выражения. Массив будет содержать подстроки между совпадениями регулярного выражения.Фактически совпавший текст отбрасывается. Если вы укажете ограничение, результирующий массив будет содержать не более указанного количества подстрок. Строка темы будет разделена не более чем limit-1 раз, а последний элемент в массиве будет содержать неразделенный остаток строки темы. split чувствителен к регистру. spliti — нечувствительный к регистру эквивалент.

Дополнительную информацию о наборе функций ereg

см. В руководстве по PHP.

Набор функций mb_ereg

Функции mb_ereg работают точно так же, как функции ereg, с одним ключевым отличием: в то время как ereg обрабатывает регулярное выражение и строку темы как серию 8-битных символов, mb_ereg может работать с многобайтовыми символами из различных кодовых страниц.Например. закодировано с помощью кодовой страницы Windows 936 (упрощенный китайский), слово 中国 («Китай») состоит из четырех байтов: D6D0B9FA. Использование функции ereg с регулярным выражением. в этой строке в результате будет получен первый байт D6. Точка соответствует ровно одному байту, поскольку функции ereg ориентированы на байты. Использование функции mb_ereg после вызова mb_regex_encoding («CP936») даст в результате байты D6D0 или первый символ 中.

Чтобы убедиться, что ваше регулярное выражение использует правильную кодовую страницу, вызовите mb_regex_encoding (), чтобы установить кодовую страницу.Если вы этого не сделаете, вместо этого будет использоваться кодовая страница, возвращаемая или установленная mb_internal_encoding ().

Если ваш сценарий PHP использует UTF-8, вы можете использовать функции preg с модификатором / u для сопоставления многобайтовых символов UTF-8 вместо отдельных байтов. Функции preg не поддерживают другие кодовые страницы.

См. Руководство по PHP для получения дополнительной информации о наборе функций mb_ereg

Дополнительная литература

Книга «Освоение регулярных выражений» не только объясняет все, что вы хотите знать и не хотите знать о регулярных выражениях.В нем также есть отличная глава о наборе функций PHP preg с подробностями о базовом механизме регулярных выражений PCRE и множеством примеров кода PHP, демонстрирующих более сложные методы. В книге не рассматриваются наборы функций ereg и mb_ereg.

Моя рецензия на книгу Освоение регулярных выражений

Сделайте пожертвование

Этот веб-сайт только что сэкономил вам поездку в книжный магазин? Сделайте пожертвование в поддержку этого сайта, и вы получите неограниченный доступ к этому сайту без рекламы!

data2type GmbH: Regex и PHP | preg-Funktionen

(Auszug aus «Reguläre Ausdrücke» фон Джеффри Э.Ф. Фридл)

preg_quote ( ввод [, Begrenzer ])

Параметр

ввод

Ein String, der in einem Pattern-Argument als literaler String behandelt werden soll (siehe Der »Pattern« -Parameter).

beginzer

Ein optionaler, exakt ein Zeichen langer String, der im Pattern-Argument als Begrenzungszeichen verwendet werden soll.

Rückgabewert

preg_quote erzeugt eine Версия от input , in der die Regex-Metazeichen maskiert sind.Wenn beginzer angegeben wird, wird dieses Zeichen ebenfalls maskiert.

Erläuterungen

Wenn ein String vorhanden ist, der als literaler Текст в einer Regex verwendet werden soll, sollte man diesen mit preg_quote behandeln, damit die Zeichen darin nicht als Regex-Metazeichen translatetiert werden. Man kann auch das Begrenzungszeichen angeben, das man verwenden wird, auch dieses wird dann maskiert.

Die Funktion preg_quote ist schon sehr spezialisiert, und man wird sie nicht allzu häufig verwenden, dennoch ein Beispiel:

  / * Электронная почта с $ MailBetreff в теме: -Zeile herausfiltern * /
$ pattern = '/ ^ Тема: \ s + (Re: \ s *) *'.Тема: \ s + (Re: \ s *) * \ * \ * Sonderangebot \ * \ * \ (Jetzt zugreifen \! \) / Mi  

der gefahrlos in einem Pattern-Argument einer preg-Funktion verwendet werden kann.

Венн для бегренцер das Zeichen ›{‹ oder irgendein anderes klammerartiges Zeichen verwendet wird, dann wird nur dieses maskiert, nicht aber das Gegenstück (›}‹). Verwenden Sie für diesen Zweck также Nur ungepaarte Begrenzungszeichen.

Außerdem wird weder Whitespace noch ›#‹ maskiert; das Resultat eignet sich также nicht für eine Mustersuche mit dem x -Modifikator.

Alles in allm ist preg_quote nur eine halbherzige Lösung zur Behandlung von trustbigen literalen Texten в einer PHP-Regex. Нур дас Проблема »Text-zu-Regex« wird gelöst, nicht aber der Teilschritt »Regex-zu-Pattern-Argument«, дер für einen allgemeinen Einsatz mit den preg-Funktionen notwendig wäre. Eine Lösung zu diesem Problem wird unter »Fehlende« preg-Funktionen entwickelt.

Hàm preg_quote trong PHP

Tt cả danh mục

  • PHP

    • PHP CƠ BẢN
    • PHP HƯỚNG ĐỐI TƯỢNG
    • СТАНДАРТЫ PHP
    • LARAVEL
    • PHP и MYSQL
  • ПИТОН

    • PYTHON CƠ BẢN
    • PYTHON NÂNG CAO
    • PYTHON и MYSQL
  • JAVASCRIPT

    • JAVASCRIPT CƠ BẢN
    • JQUERY JS
    • ВУЭ.JS
    • ECMASCRIPT
  • NODE.JS

    • NODE.JS CƠ BẢN
    • ЭКСПРЕСС РАМА
    • NODE.JS и MYSQL
    • NODE.JS и MONGODB
  • ЯДРО JAVA
  • SQL
  • MONGO DB
  • HTML
  • CSS
  • THUẬT CÔNG NGHỆ
  • ИНСТРУМЕНТЫ И ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ
  • TIN TỨC & REVIEW
  • ОЛОВО TUYỂN DỤNG
  • LIÊN HỆ

БАЗОВЫЙ ДО ПРОДВИЖЕНИЯ


  • БОЛЬШЕ

  • Дом
  • GIỚI THIỆU
  • Lp trình

    • PHP
    • PHP CƠ BẢN
    • PHP HƯỚNG ĐỐI TƯỢNG
    • СТАНДАРТЫ PHP
    • LARAVEL
    • PHP и MYSQL
    • ПИТОН
    • PYTHON CƠ BẢN
    • PYTHON NÂNG CAO
    • PYTHON и MYSQL
    • JAVASCRIPT
    • JAVASCRIPT CƠ BẢN
    • JQUERY JS
    • ВУЭ.JS
    • ECMASCRIPT
    • NODE.JS
    • NODE.JS CƠ BẢN
    • ЭКСПРЕСС РАМА
    • NODE.JS и MYSQL
    • NODE.JS и MONGODB
    • БОЛЬШЕ
    • ЯДРО JAVA
    • SQL
    • MONGO DB
    • HTML
    • CSS
    ОСНОВНЫЕ НАПРАВЛЕНИЯ
  • Thủ Thuật Công Ngh

    • THUẬT CÔNG NGHỆ
    • ИНСТРУМЕНТЫ И ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ
    • TIN TỨC & REVIEW
  • ОЛОВО TUYỂN DỤNG
  • Liên Hệ
  • Дом
  • PHP

    • PHP CƠ BẢN
    • PHP HƯỚNG ĐỐI TƯỢNG
    • СТАНДАРТЫ PHP
    • LARAVEL
    • PHP и MYSQL
  • ПИТОН

    • PYTHON CƠ BẢN
    • PYTHON NÂNG CAO
    • PYTHON и MYSQL
  • JAVASCRIPT

    • JAVASCRIPT CƠ BẢN
    • JQUERY JS
    • ВУЭ.JS
    • ECMASCRIPT
  • NODE.JS

    • NODE.JS CƠ BẢN
    • ЭКСПРЕСС РАМА
    • NODE.JS и MYSQL
    • NODE.JS и MONGODB
  • БОЛЬШЕ

    • ЯДРО JAVA
    • SQL
    • MONGO DB
    • HTML
    • CSS
  • ОЛОВО TUYỂN DỤNG
  • Liên Hệ

PostJob

Tìm kiếm

Gợi ý

  • Hc PHP
  • Питон
  • Узел.js
  • JavaScript
  • MongoDB

Автор: V Thanh Tài

26-05-2017
5 phút đọc

Размер шрифта


.