PHP preg_replace - регулярное выражение, не включающее фразу - PullRequest
2 голосов
/ 01 февраля 2010
$test = "<div><b><i>#uniquetag#</b></i></div> <div>Keep this</div>";

$test = preg_replace("/<div(.*)#uniquetag#(.*)<\/div>/i", "#uniquetag#", $test);

Я хочу, чтобы результат был

$test = "#uniquetag# <div>Keep this</div>";

Но возвращается

$test = "#uniquetag#";

Думаю, я знаю почему. (. *) является жадным и продлевает поиск до конца. Но я не могу понять, как правильно это сделать.

Обновление:

Особая благодарность ghostdog74. Старая проблема решена. Возникла новая проблема ....

$test = "<div></div> <div><b><i>#uniquetag#</b></i></div> <div>Keep this</div>";

$test = preg_replace("/<div(.*)#uniquetag#(.*?)<\/div>/i", "#uniquetag#", $test);

Ожидаемый результат:

$test = "<div></div> #uniquetag# <div>Keep this</div>";

Но получается

$test = "#uniquetag# <div>Keep this</div>";

Опять же, я считаю, что это из-за первого (. ). Изменение его на (. ?) Также не поможет. Нужно придумать способ исключить.

Ответы [ 2 ]

3 голосов
/ 01 февраля 2010

изменить (.*) на (.*?)

3 голосов
/ 01 февраля 2010

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

См. здесь для получения дополнительной информации.

...