Поскольку регулярные выражения POSIX (ereg) устарели с PHP 5.3.0, я хотел бы знать простой способ преобразования старых выражений в PCRE (Perl Compatible Regular Expressions) (preg) .
Например, у меня есть это регулярное выражение:
eregi('^hello world');
Как преобразовать выражения в выражения, совместимые с preg_match
?
Примечание. Этот пост служит заполнителем всех сообщений, связанных с преобразованием из ereg в preg, и в качестве дублирующих вариантов для связанных вопросов. Пожалуйста, не закрывайте этот вопрос.
Связанный:
- Как удалить повторяющиеся ссылки со страницы, кроме первой
- Как сделать замену только на некотируемые части строки?
- preg_replace с двумя массивами
- Являются ли PHP preg_functions многобилетными безопасными?
- Regex игнорировать URL уже в HTML-тегах
- Как изменить eregi PHP на preg_match
- Изменение ereg_replace на эквивалентное preg_replace
Самым большим изменением в синтаксисе является добавление разделителей .
ereg('^hello', $str); preg_match('/^hello/', $str);
Разделители могут быть практически любыми, что не является буквенно-цифровым, обратным слэшем или символом пробела. Наиболее часто используются ~
, /
и #
.
Вы также можете использовать соответствующие скобки:
preg_match('[^hello]', $str); preg_match('(^hello)', $str); preg_match('{^hello}', $str); // etc
Если ваш разделитель найден в регулярном выражении, вам нужно его избежать:
ereg('^/hello', $str); preg_match('/^\/hello/', $str);
Вы можете легко избежать всех разделителей и зарезервированных символов в строке с помощью preg_quote :
$expr = preg_quote('/hello', '/'); preg_match('/^'.$expr.'/', $str);
Кроме того, PCRE поддерживает модификаторы для различных вещей. Одним из наиболее часто используемых является нечувствительный к регистру модификатор i
, альтернативный eregi :
eregi('^hello', 'HELLO'); preg_match('/^hello/i', 'HELLO');
Вы можете найти полную ссылку на синтаксис PCRE в PHP в руководстве , а также список различий между регулярным выражением POSIX и PCRE, чтобы помочь преобразовать выражение.
Однако в вашем простом примере вы не будете использовать регулярное выражение:
stripos($str, 'hello world') === 0
Замена Ereg с помощью preg (начиная с PHP 5.3.0) была правильным шагом в нашу пользу.
preg_match, который использует синтаксис регулярных выражений, совместимый с Perl, часто является более быстрой альтернативой ereg.
Вы должны знать 4 основных элемента для переноса шаблонов ereg в preg:
Добавить разделители (/): 'pattern' => '/pattern/'
Escape delimiter, если он является частью шаблона: 'patt/ern' => '/patt\/ern/'
Обеспечьте его программно следующим образом:
$old_pattern = '<div>.+</div>';
$new_pattern = '/' . addcslashes($old_pattern, '/') . '/';
eregi ( совпадение без учета регистра): 'pattern' => '/pattern/i'
Итак, если вы используете функцию eregi для соответствия case insenstive, просто добавьте 'i' в конец нового шаблона ('/ pattern /') ,
Значения ASCII : В ereg, если вы используете номер в шаблоне, предполагается, что вы ссылаетесь на ASCII символа. Но в preg число не рассматривается как значение ASCII. Таким образом, если ваш шаблон содержит значение ASCII в выражении ereg (например: новая строка, табуляции и т. Д.), Преобразуйте его в шестнадцатеричный и префикс с помощью \ x.
Example: 9(tab) becomes \x9 or alternatively use \t.
Из версии PHP версии 5.3 устаревший.
Для перехода к ereg to preg_match просто небольшое изменение в нашем шаблоне
Сначала вы добавили делиметр к вашему коду
например ereg('A-Z0-9a-z','string');
в
preg_match('/A-Z0-9a-z/','string');
Для eregi
– eregi
чувствительного совпадения eregi
'i' после последнего разделителя
например
eregi('pattern','string');
в
preg_match ('/pattern/i','string');
Есть больше различий между ereg()
и preg_replace()
чем просто синтаксис:
Возвращаемое значение:
FALSE
ereg()
возвращает FALSE
, preg_match()
возвращает 0
ereg()
возвращает длину строки или 1
, preg_match()
всегда возвращает 1
Результирующий массив совпадающих подстрок: если какая-либо подстрока вообще не найдена ( (b)
in ...a(b)?
), Соответствующий элемент в результате ereg()
будет FALSE
, а в preg_match()
он не будет установлен вообще.
Если кто-то не достаточно храбр, чтобы преобразовать его или ее ereg()
в preg_match()
, он или она может использовать mb_ereg () , который по-прежнему доступен в PHP 7.