PHP: Preg_replace, границы слов и символы без слова

Мне нужно заменить слова, которые начинаются с метки хэша (#) внутри текста. Ну, я знаю, как я могу заменить целые слова.

preg_replace("/\b".$variable."\b/", $value, $text);

Поскольку этот модификатор \ b принимает только символы слова, поэтому слово, содержащее метку хэша, не будет заменено.


У меня есть этот html, который содержит переменные типа #companyName, которые я заменяю на значение.

\b соответствует буквенно-цифровому символу (сокращенное \w ) и не-буквенно-цифровому символу ( \W ), считая символы подчеркивания буквенно-цифровыми. Это означает, что, как вы видели, это не будет соответствовать до # (если только этому не предшествует символ alnum).

Я предлагаю, чтобы вы только окружали ваше слово запроса \b если оно начинается и заканчивается символом alnum.

Итак, возможно, что-то вроде этого (хотя я не знаю никакого PHP, поэтому это может быть синтаксически совершенно неверным):

 if (preg_match('/^\w/', $variable)) $variable = '\b'.$variable; if (preg_match('/\w$/', $variable)) $variable = $variable.'\b'; preg_replace('/'.$variable.'/', $value, $text); 

Все \ b действительно соответствует изменению между символами без слова и слова. Поскольку вы знаете, что $ variable начинается с символов, отличных от слов, вам просто нужно предшествовать совпадению символом без слов (\ W).

Однако, поскольку вы заменяете, вам нужно либо сделать неглавное соответствие нулевой ширине, то есть смотреть сзади:

 preg_replace("/(?<=\\W)".$variable."\\b/", $value, $text); 

или включить согласованный символ в заменяющий текст:

 preg_replace("/(\\W)".$variable."\\b/", $value, "$1$text"); 

Следующее выражение также может использоваться для обозначения границ слов, содержащих символы, отличные от слов:

  preg_replace("/(^|\s|\W)".$variable."($|\s|\W)/", $value, $text); 

Почему не просто

 preg_replace("/#\b".$variable."\b/", $value, $text);