使用单词边界正则表达式的Pregmatch不能按预期工作

时间:2017-02-02 06:00:07

标签: php preg-match

我正在使用preg_match查找确切的单词和短语,并用AHREF链接替换它们。我正在使用单词边界正则表达式,但它无法正常工作。它在单词中匹配。

实施例: 'ring'与'ear ring '相匹配。我不希望这样。我只想要'戒指'

我的preg_match正则表达式是错误的吗?

$keyword="rings";

$text="women's earrings, clothing rings, earrings, rings";

if (preg_match("/\b$keyword\b/i",$text)) 

斜体意在下面加下划线

output = "women's ear*rings*, clothing *rings*, ear*rings*, *rings*"

预期= "women's earrings, clothing *rings*, earrings, *rings*"

更新 我认为问题在于替换功能:

function str_replace_first($from, $to, $subject)
    {    $from = '/'.preg_quote($from, '/').'/';
    return preg_replace($from, $to, $subject,2); 
    }

if (preg_match_all("/\b$keyword\b/i",$text,$matches)>0) 
    {
                print_r($matches)."<p> ";   

            $ahref="<a href='$anchor_url'>$keyword</a>";
            $text=str_replace_first($keyword, $ahref, $text);
           } ELSE {

                echo "<p>no Match<br>";
            }
echo $text;

1 个答案:

答案 0 :(得分:0)

直接使用preg_replace,而不收集匹配项,因为您实际上不会使用它们(您只需要用其他文本包装它们):

$keyword="rings";
$anchor_url = "http_//www.t.tt";
$url = "<a href='$anchor_url'>\$0</a>";
$text="women's earrings, clothing rings, earrings, rings";
$newtxt = preg_replace('/\b' . preg_quote($keyword, '/') . '\b/i', $url, $text);
if ($newtxt != $text) {
    echo $newtxt;
} else { echo "No matches!"; }

请参阅PHP demo

请注意,您需要\b字边界才能匹配整个单词。您还需要preg_quote关键字并转义正则表达式分隔符。然后,由于您使用的是不区分大小写的正则表达式,因此无法在替换中使用$keyword硬编码,您需要对整个匹配使用$0反向引用。如果您需要检查是否没有匹配,只需将新字符串与原始字符串进行比较。