Php 正则表达式只匹配单个单词

Php 正则表达式只匹配单个单词,php,regex,preg-replace,Php,Regex,Preg Replace,我得到了以下函数,其中包含一个正则表达式 public function searchDOM( $content, $search, $replace, $excludedParents = [] ) { $dom = HtmlDomParser::str_get_html( $content, true, true, DEFAULT_TARGET_CHARSET, false, DEFAULT_BR_TEXT, DEFAULT_SPAN_TEXT ); foreach ( $dom-&g

我得到了以下函数,其中包含一个正则表达式

public function searchDOM( $content, $search, $replace, $excludedParents = [] )
{

$dom = HtmlDomParser::str_get_html(
$content,
true,
true,
DEFAULT_TARGET_CHARSET,
false,
DEFAULT_BR_TEXT,
DEFAULT_SPAN_TEXT
);


foreach ( $dom->find( 'text' ) as $element ) {

if ( !in_array( $element->parent()->tag, $excludedParents ) )
$element->innertext = preg_replace(
'/\b' . preg_quote( $search, "/" ) . '\b/i',
$replace,
$element->innertext
);

}
我正在将
$search
传递给函数,如下所示:

    foreach ( $searcharray as $search ) {

        $text    = $search[ 'text' ];
        $url     = $search[ 'url' ];

        $replace = "<a href='$url'>\$0</a>";
        $content = $this->searchDOM(
            $content,
            $text,
            $replace,
            [ 'a', 'img', 'script', 'style', 'code', 'pre' ]
        );
    }
foreach($searcharray作为$search){
$text=$search['text'];
$url=$search['url'];
$replace=“”;
$content=$this->searchDOM(
$content,
$text,
$replace,
['a'、'img'、'script'、'style'、'code'、'pre']
);
}
这很好用。但是如果搜索字符串包含
+
,例如检测失败


<>我如何解决这个问题?

< p>因为你的搜索短语可能包含非单词字符,你应该考虑以最长的顺序将它们传递给你的函数,按降序排列。首先,通过
hello world
,然后通过
hello
,然后通过
world
,等等

现在,如果在搜索短语的开头或结尾有一个非单词字符,
/\b\+search\b/i
将与
i want+search.
中的
+search
不匹配,因为空格和
+
之间没有单词边界(因为两者都是非单词字符)。但是,它会在
I want+search
中找到匹配项,因为
t
+
之间有一个单词边界

使用lookarounds来声明前面/后面没有单词char的位置:

'/(?<!\w)' . preg_quote( $search, "/" ) . '(?!\w)/i'

请参阅。

我认为您应该发布完整的相关代码。
/\bhello world\b/i
没有问题。我怀疑您有一个
$search
es数组。有环吗?就我所知,它很好用。我更新了我的问题好的,我仍然认为问题在于如何将
$search
传递到这个函数中(您还没有显示)。首先,传递
hello world
,然后传递
hello
,然后传递
world
-首先处理最长的搜索短语。请显示如何将
$search
传递到此函数和
$search
值。
$searches= array();
$searches = array(
        array("text" => "hello", "url" => "hello-URL"),
        array("text" => "world", "url" => "world-URL"), 
        array("text" => "hello world", "url" => "helloworld-URL") 
    );
usort($searches, function($a, $b) {
    return strlen($b['text']) - strlen($a['text']);
});
$pat = '~(?<!\w)(?:' . implode("|", 
        array_map(function($x) { return preg_quote($x['text'], '~'); }, $searches)
    ) . ')(?!\w)~i';
// echo "$pat\n"; // => ~(?<!\w)(?:hello world|hello|world)(?!\w)~i
$keys = array();
$vals = array();
foreach($searches as $search) {
    $keys[] = $search['text'];
    $vals[] = $search['url'];
}
$tmparr = array_combine($keys, $vals);

$text = preg_replace_callback($pat, function($m) use ($tmparr) {
    return "<a href='" . $tmparr[$m[0]] . "'>" . $m[0] . "</a>"; }, $text);

echo $text;