PHP preg_replace regex для удаления последнего тега

1

У меня возникли проблемы с тем, чтобы сделать следующий код для вывода ожидаемого результата:

<?php
$a='##foobar(a b, c d)@@f()</td>a</td>';
echo preg_replace('/foobar.*?\)(.*)\<\/td\>$/', 'blah(this)$1', $a);

Ожидаемый результат должен быть ##blah(this)@@f()</td>a, однако его вывод: ##blah(this)@@f()a (с использованием phptester).

Мне не имеет смысла, как он выводит последний a, но не предыдущий </td>. Я хочу удалить только </td>.

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

Я избегаю каждого особого персонажа. Специальные символы регулярных выражений являются: .\+ *? [ ^ ] $ ( ) { } = ! < > |: - .\+ *? [ ^ ] $ ( ) { } = ! < > |: - .\+ *? [ ^ ] $ ( ) { } = ! < > |: -.

  • 1
    Браузер обрабатывает </td> как тег, поэтому он не отображается.
  • 0
    Как вы проверяете свой результат? Потому что, если вы выводили данные в браузер, вы бы не увидели закрытие элемента <td> .
Показать ещё 4 комментария
Теги:

2 ответа

2
Лучший ответ

Ваше регулярное выражение - это нормально, проблема заключается в том, что браузер не отображает закрывающий тег. Попробуй это:

<?php
$a = '##foobar(a b, c d)@@f()</td>a</td>';
$b = preg_replace('/foobar.*?\)(.*)\<\/td\>$/', 'blah(this)$1', $a);

echo htmlentities($b);
  • 0
    Обратите внимание: вам не нужны htmlentities() для всего, что вы делаете. Просто вы можете увидеть его в браузере только для тестирования.
2

Вместо использования phptester вы можете использовать PHP в интерактивном режиме с командной строкой:

php -a

а затем вы вводите интерактивную оболочку, очень похожую на python.

Тестирование вашего кода с помощью этого инструмента, мы можем видеть, что ваше регулярное выражение в порядке.

$ php -a
Interactive shell

php > $a='##foobar(a b, c d)@@f()</td>a</td>';
php > echo preg_replace('/foobar.*?\)(.*)\<\/td\>$/', 'blah(this)$1', $a);
##blah(this)@@f()</td>a
php > 
  • 0
    Я не знал об этой интерактивной оболочке, спасибо.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню