Мне нужно заменить слова, которые начинаются с метки хэша (#) внутри текста. Ну, я знаю, как я могу заменить целые слова.
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);