2013-06-30 6 views
1

А клиент сообщил об ошибке, и я проследил его к этому коду, но я не могу понять, что случилось с ним:PHP preg_match возвращение нулевой

$source = "This is a test.\n\n-- a <span style='color:red'>red word</span>!\n\n- a red word!\n\n"; 
//$find = "- a red word!"; // This one works! 
$find = "- a <span style='color:red'>red word</span>!"; // This one doesn't... 
$replace = "&bull; a <span style='color:red'>red word</span>!"; 
$pattern = '/^' . preg_quote($find) . '$/'; 
$results = preg_replace($pattern, $replace, $source); 
die ("Results: " . serialize($results));    

Я включил образец $find, который работает против $find, который не работает. Любая идея, почему uncommented $find не работает?

(Примечание: Я на самом деле не пытаюсь разобрать HTML и поиск чисто образец, поэтому мне не нужна корректировка на подходе)

+1

Пожалуйста, используйте правильно ['preg_quote()'] (http://php.net/manual/en/function.preg-quote.php), вы ** должны ** определить разделитель, который используете, иначе значением по умолчанию является 'NULL', поэтому попробуйте' $ pattern = '/ ^'. preg_quote ($ find, '/'). '$ /', '. Также, если вы включили отчет об ошибках или проверили журналы, вы должны были что-то заметить. – HamZa

+2

Почему бы не использовать 'str_replace'? –

ответ

2

preg_quote не избежать символа косой черты нашли в </span>, что делает шаблон недействительным. preg_quote делает вид, определяющий разделитель для шаблона:

$pattern = '/^' . preg_quote($find, '/') . '$/'; 
+0

Правда, я только что увидел это. – Joni

+0

Вот и все! Спасибо, Джони! – Anthony

1

Вы должны удалить якоря (^$), так как то, что вы попробуйте совместить только подстроку, а не всю строку.

$pattern = '~' . preg_quote($find) . '~'; 
1

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

$pattern = '/' . preg_quote($find) . '/'; 

или обеспечить заднюю слэш разделитель функции preg_quote в качестве второго параметра, как этот

$pattern = '/' . preg_quote($find, '/') . '$/'; 

From the PHP documentation на функцию preg_quote (описание второго параметра):

If the optional delimiter is specified, it will also be escaped. This is useful for escaping the delimiter that is required by the PCRE functions. The/is the most commonly used delimiter. 

И избавиться от ^ и $, как уже было предложено - вы не соответствуете всей строке.

Смежные вопросы