Почему этот стандартный Reg Ex не работает в PHP-функции ereg - PullRequest
1 голос
/ 17 декабря 2008

Я немного новичок в Reg Ex и не до конца понимаю разницу между разными вкусами. Тем не менее, у меня есть базовый Reg Ex, который работает, когда я пробую его через систему UNIX (vi и grep), но не когда я пытаюсь использовать его в функциях PHP ereg. Я подозреваю, что в PHP-функции ereg есть что-то другое, из-за чего это не работает:

<?php
$string = 'Feugiat <em>hendrerit</em> sit iriuredolor aliquam.';
$string = ereg_replace("<em\b[^>]*>(.*?)</em>","\\1",$string);
echo $string;
?>

Я бы хотел, чтобы это вывело Feugiat hendrerit sit iriuredolor aliquam. без тегов em. Однако он просто возвращает пустую строку.

Ответы [ 8 ]

4 голосов
/ 17 декабря 2008

Вам может потребоваться избежать обратной косой черты:

$string = ereg_replace("<em\\b[^>]*>(.*?)</em>","\\1",$string);

Это потому, что \b в строке PHP означает нечто отличное от \b в регулярном выражении. Использование \\ в строке PHP проходит через одну обратную косую черту до ereg_replace(). Это та же самая причина, по которой вам нужно использовать двойную обратную косую черту в строке замены "\\1".

В зависимости от вашего приложения вы также можете рассмотреть возможность того, что ваш ввод $string не содержит каких-либо тегов <em>. В этом случае приведенные выше операторы приведут к пустой строке, которая, вероятно, не соответствует вашим намерениям.

2 голосов
/ 17 декабря 2008

Вероятно, стоит избегать ereg для будущей совместимости. Похоже, это было амортизировано в php6 в соответствии с this .

Расширение ereg, которое поддерживает регулярные выражения POSIX, удалено из базовой поддержки PHP.

2 голосов
/ 17 декабря 2008

ereg_replace не поддерживает утверждение границы слова (\ b) или не жадный модификатор (*?). PEZ прав, вероятно, вы должны использовать preg.

preg_replace('!<em\\b[^>]*>(.*?)</em>!', '$1', $string)

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

2 голосов
/ 17 декабря 2008

Если вы используете регулярное выражение только для удаления тегов html, возможно, более подходящей будет функция php's strip_tags ().

php.net ручная запись

1 голос
/ 18 декабря 2008

Насколько я знаю, ereg не обрабатывает границы \ b, в то время как preg это делает. Кроме того, я думаю, что двойные кавычки в регулярном выражении могут вызвать проблемы с обратной косой чертой

1 голос
/ 18 декабря 2008

PHP-функции ereg используют очень ограниченный вариант регулярного выражения, называемый POSIX ERE . Мое сравнение вкусов указывает на то, что этому вкусу не хватает по сравнению с современными ароматами.

В вашем случае слово border \ b не поддерживается. Строгая реализация POSIX пометит \ b как ошибку.

Ваше решение - использовать вместо этого функции preg:

preg_replace('!<em\b[^>]*>(.*?)</em>!', '$1', $string);

По сравнению с другими ответами, которые вы получили: не избегайте обратной косой черты в \ b и используйте $ 1 для замены. preg_replace использует другой текстовый синтаксис замены, чем ereg_replace.

1 голос
/ 17 декабря 2008

Я никогда не понимал ereg_ и всегда использую preg. Если вы добавите обратную косую черту, как предлагает Грег, и измените на preg_, она скомпилируется.

$string = preg_replace('%<em\\b[^>]*>(.*?)</em>%','\\1',$string);

Редактировать: Я согласен с другими здесь, что этот конкретный подход не может быть идеальным для этой проблемы. Но, тем не менее, preg_ чаще всего используется при использовании регулярных выражений в PHP.

1 голос
/ 17 декабря 2008

Если вы хотите удалить теги <em>, я бы порекомендовал следующее:

<?php
  $string = 'Feugiat <em>hendrerit</em> sit iriuredolor aliquam.';
  $string = ereg_replace("</?em\\b[^>]*>", "", $string);
  echo $string;
?>

Грег Хьюгилл прав насчет экранирования обратной косой черты в строке PHP. Это нужно сделать, чтобы получить буквальную обратную косую черту в строке шаблона регулярного выражения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...