Почему этот стандартный Reg Ex не работает в функции PHP ereg

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
0
1 516
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

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

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

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

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

В качестве альтернативы вы можете использовать строки в одинарных кавычках, чтобы не было интерпретации содержимого строки.

Sean McSomething 17.12.2008 22:11

Ваш ответ неверен. \\ 1 не является обратной ссылкой в ​​тексте замены preg_replace. 1 доллар есть.

Jan Goyvaerts 18.12.2008 05:46

одинарные кавычки по-прежнему используют escape-последовательности (обратная косая черта), они просто не оценивают $

FryGuy 18.12.2008 05:51

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

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

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

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

ввод вручную на php.net

Да, конечно, но я просто привел это в качестве примера, b / c я не понимал, как PHP использует RegEx. И я могу представить ситуацию, когда я хочу удалить только один конкретный тег.

bryan kennedy 17.12.2008 23:33

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

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

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

Ваш ответ неверен. \\ 1 не является обратной ссылкой в ​​тексте замены preg_replace. 1 доллар есть.

Jan Goyvaerts 18.12.2008 05:45

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

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

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

Почему вы использовали! вместо%, чтобы инкапсулировать беременность? Есть ли в этом преимущество или это просто предпочтение? У меня такой же вопрос о том, как вы используете $ 1 против \\ 1

bryan kennedy 17.12.2008 23:42

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

Alan Moore 18.12.2008 03:00

Вероятно, лучше избегать 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 это делает. Кроме того, я думаю, что двойные кавычки в регулярном выражении могут вызвать проблемы с обратной косой чертой

Другие вопросы по теме