Php 替换以#开头的占位符,然后替换整个单词

Php 替换以#开头的占位符,然后替换整个单词,php,regex,preg-replace,Php,Regex,Preg Replace,我需要替换文本中以哈希标记(#)开头的单词。 我知道如何替换整个单词 preg\u replace(“/\b”。$variable.\b/”,$value,$text) 因为\b修饰符只接受单词字符,所以包含哈希标记的单词不会被替换 我有一个html,其中包含“companyName”类型的变量,我用一个值替换它们。为什么不 preg_replace("/#\b".$variable."\b/", $value, $text); \b字母数字字符(速记\w)和非字母数字字符(\w)之间的匹配

我需要替换文本中以哈希标记(#)开头的单词。 我知道如何替换整个单词

preg\u replace(“/\b”。$variable.\b/”,$value,$text)

因为\b修饰符只接受单词字符,所以包含哈希标记的单词不会被替换


我有一个html,其中包含“companyName”类型的变量,我用一个值替换它们。

为什么不

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

\b
字母数字字符(速记
\w
)和非字母数字字符(
\w
)之间的匹配,将下划线计算为字母数字。这意味着,正如您所看到的,它在
#
之前不匹配(除非前面有alnum字符)

我建议您仅在查询词以alnum字符开头和结尾时使用
\b

所以,可能是这样的(虽然我不知道任何PHP,所以这在语法上可能是完全错误的):


\b所做的只是匹配非单词字符和单词字符之间的更改。因为您知道$variable以非单词字符开头,所以只需在匹配之前加一个非单词字符(\W)

但是,由于要替换,您需要使非单词匹配零宽度,即向后看:

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

以下表达式也可用于标记包含非单词字符的单词的边界:-

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

我想应该是
preg\u replace(“/\b#“.”$variable.\b/”,$value,$text)
@user338128:不,
#
不被视为单词字符,因此它将不匹配。适用于我的示例
最新版本
-请参阅@yasirfarooqui。谢谢大家!<代码>\b
不需要介于
\w
\w
之间。它会很好用的。@alpha-mouse:对,我忘了提那个。尽管如此,解决方案仍然有效。+1我在准备同一个问题的我自己版本时遇到了你们的答案;有关各种建议的运行示例,请参阅原始问题中提到的“以哈希标记(#)开头的单词”,这就是我的答案。这里发生了什么$当变量是连字符单词的一部分时,不应替换它。相反,最后一个连字符消失了。php>$text='update';php>$variable='date';php>$value='Date';php>echo preg_replace(“/(^ |\s |\W)”.$variable.($|\s |\W)/”,$value,$text);到目前为止,这个问题最好有个答案。
preg_replace("/(\\W)".$variable."\\b/", $value, "$1$text");
 preg_replace("/(^|\s|\W)".$variable."($|\s|\W)/", $value, $text);