PHP: регулярное выражение и хеш-ключ в строке - PullRequest
1 голос
/ 21 сентября 2010

Как мне обратиться к специальным символам в Regex? @ ? # $ % %...
этот паттерн ищет букву между префиксом и суффиксом.

$pattern = '/((?<!\b$PREFIX)$LETTER|$LETTER(?!$SUFFIX\b))/i';

$string = 'end'; 

$prefix = 'e';  
$letter = 'n';  
$suffix = 'd';  

Но что, если $string началось с #

$string = '#end';
$prefix = ???

edit: это preg_replace полностью

$text = "<p>Newton, Einsteing and Edison. #end</p>"
$pattern = '/((?<!\b$PREFIX)$LETTER|$LETTER(?!$SUFFIX\b))/i';
echo preg_replace($pattern, '<b>\1</b>', $text);

это заменяет все n буквы жирным шрифтом n, но должно исключать n в #end

Ответы [ 2 ]

1 голос
/ 21 сентября 2010

Вы должны заключить свой шаблон в двойные кавычки, чтобы сделать интерполяцию переменных.

$pattern = "/((?<!\b$PREFIX)$LETTER|$LETTER(?!$SUFFIX\b))/i";

И еще, вы определяете префикс $ (в нижнем регистре) и используете $ PREFIX (в верхнем регистре). Таким образом, сценарий становится следующим и прекрасно работает для меня:

<?php
$PREFIX = 'e';  
$LETTER = 'n';  
$SUFFIX = 'd';  
$text = "<p>Newton, Einsteing and Edison. #end</p>";
$pattern = "/((?<!\b$PREFIX)$LETTER|$LETTER(?!$SUFFIX\b))/i";
echo preg_replace($pattern, "<b>$1</b>", $text),"\n";
?>

Выход:

<p><b>N</b>ewto<b>n</b>, Ei<b>n</b>stei<b>n</b>g a<b>n</b>d Ediso<b>n</b>. #end</p>

без форматирования кода:

N ewto n , Ei n stei n га n d Ediso n . # Конец

1 голос
/ 21 сентября 2010

Вы должны сначала убежать от специальных символов с обратной косой чертой. Но поскольку обратная косая черта уже экранирует буквы в строке, вам сначала нужно будет экранировать обратную косую черту.

$string = '\\#end';

Лучший способ сделать это - использовать функцию preg_quote() в вашей строке и указать, какой тип разделителя вы используете (здесь "/").

preg_quote($string, '/');
...