Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP preg_替换为保持匹配不工作_Php_Regex - Fatal编程技术网

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
,而具有单词边界的正则表达式不会这样做。