У меня возникли проблемы с тем, чтобы сделать следующий код для вывода ожидаемого результата:
<?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>
.
В моем регулярном выражении я делаю жадный матч (.*)
, Но я также пытался использовать (.*?)
, Который выводит один и тот же результат.
Я избегаю каждого особого персонажа. Специальные символы регулярных выражений являются: .\+ *? [ ^ ] $ ( ) { } = ! < > |: -
.\+ *? [ ^ ] $ ( ) { } = ! < > |: -
.\+ *? [ ^ ] $ ( ) { } = ! < > |: -
.
Ваше регулярное выражение - это нормально, проблема заключается в том, что браузер не отображает закрывающий тег. Попробуй это:
<?php
$a = '##foobar(a b, c d)@@f()</td>a</td>';
$b = preg_replace('/foobar.*?\)(.*)\<\/td\>$/', 'blah(this)$1', $a);
echo htmlentities($b);
htmlentities()
для всего, что вы делаете. Просто вы можете увидеть его в браузере только для тестирования.
Вместо использования 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 >
</td>
как тег, поэтому он не отображается.<td>
.