PHP preg_替换为保持匹配不工作
我试图创建一个简单的函数来搜索字符串中的单词并将其链接。问题是,有时这个词的结尾有一个点或逗号,我想保留它。所以PHP preg_替换为保持匹配不工作,php,regex,Php,Regex,我试图创建一个简单的函数来搜索字符串中的单词并将其链接。问题是,有时这个词的结尾有一个点或逗号,我想保留它。所以文本单词。应该改为文本。而不是文本 这是我到目前为止的职责。我不明白为什么它不起作用: $string = "words are plenty in the world. another world and another world,comma."; function findWord ($string, $word, $link) { $patt = "/(?:^|[^a
文本单词。
应该改为文本。
而不是文本
这是我到目前为止的职责。我不明白为什么它不起作用:
$string = "words are plenty in the world. another world and another world,comma.";
function findWord ($string, $word, $link) {
$patt = "/(?:^|[^a-zA-Z])(" . preg_quote($word, '/') . ")(?:$|[^a-zA-Z])/i";
return preg_replace($patt, ' <a href="'.$link.'" class="glossary-item">'.$word.'</a>$3', $string);
}
echo findWord ($string, "world", "#");
$string=“世界上有很多词。另一个世界和另一个世界,逗号。”;
函数findWord($string、$word、$link){
$patt=“/(?:^[a-zA-Z])(.preg_quote($word,“/”))”(:$[a-zA-Z])/i”;
返回preg_replace($patt,$3',$string);
}
echo findWord($string,“world”和“#”);
您使用了非捕获组(?:…)
来匹配搜索词周围可能包含的字符,但随后使用$3
就像它们捕获组一样(…)
因此,$3
将始终为空。您可以改为使用捕获组:
function findWord ($string, $word, $link) {
$patt = "/(^|[^a-zA-Z])(" . preg_quote($word, '/') . ")($|[^a-zA-Z])/i";
return preg_replace($patt, '$1<a href="'.$link.'" class="glossary-item">'.$word.'</a>$3', $string);
}
我更喜欢后者。您使用了非捕获组
(?:…)
来匹配搜索词周围可能包含的字符,但随后使用$3
就像它们捕获组一样(…)
因此,$3
将始终为空。您可以改为使用捕获组:
function findWord ($string, $word, $link) {
$patt = "/(^|[^a-zA-Z])(" . preg_quote($word, '/') . ")($|[^a-zA-Z])/i";
return preg_replace($patt, '$1<a href="'.$link.'" class="glossary-item">'.$word.'</a>$3', $string);
}
我更喜欢后者。只有一个问题。在这种情况下,是否也可以使用这个(单词边界修饰符):返回preg_replace(“%\b$word\b%i”,”,“,$string)@nevermind:是的,但它的工作方式会有所不同。例如,当前正则表达式将从
\u abc1
中提取abc
,而具有单词边界的正则表达式则不会提取。在这种情况下,是否也可以使用这个(单词边界修饰符):返回preg_replace(“%\b$word\b%i”,”,“,$string)@nevermind:是的,但它的工作方式会有所不同。例如,当前正则表达式将从\u abc1
中提取abc
,而具有单词边界的正则表达式不会这样做。