2016-06-17 2 views
0

Хорошо, я проверил и посмотрел, но сегодня мой SearchFU не сильный. Я сталкиваюсь с ошибкой с обратными ссылками в некоторых Regex preg_replace('~$\s*<div>([^<]*?)</div>$\s*~me', '\1', $source); Я мог бы реально использовать руку. Выражение находит <div> теги и возвращает только содержимое, удаляющее тег и включающее переводы строк. то есть:PHP preg_replace escape ampersand в backreference regex

<td> 
     <div>some value</div> 
    </td> 

становится

<td>some value</td> 

Все отлично работает до тех пор <div>&nbsp;</div>, который вызывает:

Parse error: syntax error, unexpected '&' in D:\wamp\www\processfile.php(18) 
: regexp code on line 1 Call Stack: 0.0010 143600 1. {main}() 
D:\wamp\www\processfile.php:0 0.0350 170328 2. preg_replace() 
D:\wamp\www\processfile.php:18 Fatal error: preg_replace(): Failed evaluating 
code: in D:\wamp\www\processfile.php on line 18 Call Stack: 0.0010 143600 
1. {main}() D:\wamp\www\processfile.php:0 0.0350 170328 2. preg_replace() 
D:\wamp\www\processfile.php:18 

Если удалить \ 1 обратной ссылки, выражение будет счастливо стереть все содержимое в div, но, похоже, хочет разобрать его как новое выражение.

Есть ли способ обойти это, или я должен предварительно обработать & до того, как эта строка будет выполнена?

ответ

1

Это модификатор e в конце вашего регулярного выражения. Это приводит к замене eval() 'ed. Убрать это:

preg_replace('~$\s*<div>([^<]*?)</div>$\s*~m', '\1', $source); 

См. PHP docs for PCRE pattern modifiers.

+0

Bam! Спасибо. Я знал, что это окажется чем-то простым, я бы забыл. Я уже три дня наливаю эти документы. – Toaster