PHP: Экранирование зарезервированных RegEx символов - кто-нибудь знает, что с этим не так?
Я пытаюсь избежать символов, зарезервированных регулярным выражением, с помощью обратной косой черты (не спрашивайте - достаточно сказать, что я НЕ пытаюсь проанализировать HTML:)) И я получаю что-то странное.
$regex_chars = array('[' , '\\' , '^', '$' , '.' , '|' ,
'?' , '*' , '+' , '(' , ')');
$regex_chars_escaped = array('\[ ' , '\\\\ ' , '\^ ', '\& ' ,
'\. ' , '\| ' , '\? ' , '\* ' , '\+ ' , '\( ' , '\)');
$escaped_string = str_replace($regex_chars,$regex_chars_escaped,
implode("",$regex_chars));
echo implode(' ',$regex_chars) . "<br />";
echo $escaped_string;
Пространства для ясности. Это выход
[ \ ^ $ . | ? * + ( )
\\ [ \\ \^ \& \. \| \? \* \+ \( \)
Так что все хорошо, кроме первой части. Откуда берется "\\" и почему не "\["?
2 ответа
Решение
Я полагаю, что это просто из-за порядка, в котором вы помещаете символы в массив. Попробуй это:
$regex_chars = array('\\' , '[' , '^', '$' , '.' , '|' ,
'?' , '*' , '+' , '(' , ')');
$regex_chars_escaped = array( '\\\\ ' ,'\[ ', '\^ ', '\& ' ,
'\. ' , '\| ' , '\? ' , '\* ' , '\+ ' , '\( ' , '\)');
И вы должны получить ожидаемый результат. Проверьте раздел 'потенциальные ошибки' в спецификации функции str_replace