Я немного новичок в 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. Однако он просто возвращает пустую строку.






Возможно, вам потребуется избежать обратной косой черты:
$string = ereg_replace("<em\\b[^>]*>(.*?)</em>","\\1",$string);
Это потому, что \b в строке PHP означает нечто отличное от \b в регулярном выражении. Использование \\ в строке PHP проходит через одну обратную косую черту до ereg_replace(). По этой же причине вам нужно использовать двойную обратную косую черту в заменяющей строке "\\1".
В зависимости от вашего приложения вы также можете рассмотреть возможность того, что ваш входной $string не содержит никаких тегов <em>. В этом случае приведенные выше операторы приведут к пустой строке, что, вероятно, не соответствует вашим намерениям.
Ваш ответ неверен. \\ 1 не является обратной ссылкой в тексте замены preg_replace. 1 доллар есть.
одинарные кавычки по-прежнему используют escape-последовательности (обратная косая черта), они просто не оценивают $
Если вы намерены удалить теги <em>, я бы порекомендовал следующее:
<?php
$string = 'Feugiat <em>hendrerit</em> sit iriuredolor aliquam.';
$string = ereg_replace("</?em\\b[^>]*>", "", $string);
echo $string;
?>
Грег Хьюгилл прав насчет экранирования обратной косой черты в строке PHP. Вам нужно сделать это, чтобы получить буквальную обратную косую черту в строке шаблона регулярного выражения.
Если вы используете регулярное выражение только для удаления тегов html, возможно, более подходящей будет функция php strip_tags ().
Да, конечно, но я просто привел это в качестве примера, b / c я не понимал, как PHP использует RegEx. И я могу представить ситуацию, когда я хочу удалить только один конкретный тег.
Я никогда не понимал ereg_ и всегда использую preg. Если вы добавите обратную косую черту, как предлагает Грег, и измените ее на preg_, она скомпилируется.
$string = preg_replace('%<em\\b[^>]*>(.*?)</em>%','\\1',$string);
Обновлено: я согласен с другими здесь, что этот конкретный подход может быть не идеальным для проблемы. Но, тем не менее, preg_ чаще всего используется при использовании регулярных выражений в PHP.
Ваш ответ неверен. \\ 1 не является обратной ссылкой в тексте замены preg_replace. 1 доллар есть.
ereg_replace не поддерживает утверждение границы слова (\ b) или нежадный модификатор (*?). PEZ прав, вам, вероятно, следует использовать preg.
preg_replace('!<em\\b[^>]*>(.*?)</em>!', '$1', $string)
Дополнительная обратная косая черта не является строго необходимой, потому что PHP не заменяет \ b, но рекомендуется всегда избегать обратной косой черты в строковом литерале.
Почему вы использовали! вместо%, чтобы инкапсулировать беременность? Есть ли в этом преимущество или это просто предпочтение? У меня такой же вопрос о том, как вы используете $ 1 против \\ 1
Они оба являются личными предпочтениями, но большинство разновидностей регулярных выражений используют форму $ 1 для ссылок на группы захвата в строке замены, поэтому вам следует отдать предпочтение этой форме. Вы также можете использовать $ {1}, чтобы избежать конфликтов с другими цифрами в строке замены.
Вероятно, лучше избегать ereg для будущей совместимости. Похоже, что в php6 он обесценился в соответствии с это.
The ereg extension, which supports Portable Operating System Interface (POSIX) regular expressions, is being removed from core PHP support.
Функции PHP ereg используют очень ограниченную разновидность регулярных выражений, называемую POSIX ERE. Мой сравнение вкусов указывает на все, чего этому вкусу не хватает по сравнению с современными ароматизаторами.
В вашем случае граница слова \ b не поддерживается. Строгая реализация POSIX помечает \ b как ошибку.
Ваше решение - использовать вместо этого функции preg:
preg_replace('!<em\b[^>]*>(.*?)</em>!', '$1', $string);
По сравнению с другими полученными вами ответами: не избегайте обратной косой черты в \ b и используйте для замены $ 1. preg_replace использует другой синтаксис текста замены, чем ereg_replace.
Насколько мне известно, ereg не обрабатывает граничные элементы \ b, в то время как preg это делает. Кроме того, я думаю, что двойные кавычки в регулярном выражении могут вызвать проблемы с обратной косой чертой
В качестве альтернативы вы можете использовать строки в одинарных кавычках, чтобы не было интерпретации содержимого строки.