提问者:小点点

如果在字符串中找到关键字,则将其加粗


<?php
$keywords1 = array("stack","stack overflow");
$keywords2 = array("stack overflow","stack");
$str1 = "stack overflow";
$str2 = "stack overflow";
foreach($keywords1 as $kw){
    if (preg_match("~\b$kw\b~i", $str1)) {
        $str1 = str_replace($kw,'<b>'.$kw.'</b>',$str1);
         }
}
foreach($keywords2 as $kw){
    if (preg_match("~\b$kw\b~i", $str2)) {
        $str2 = str_replace($kw,'<b>'.$kw.'</b>',$str2);
         }
}
echo $str1;
echo "<br>";
echo $str2;

?>

问候,实际上我想加粗一个关键字,如果它是在一个字符串中找到。为此,我使用了phppreg_match()方法。我的关键字存储在一个数组中,通过迭代每个关键字,我将它与我的字符串相匹配,然后加粗。我在这里面临一个问题。以上两个字符串都给我不同的输出。str1给我堆栈溢出,而str2给我堆栈溢出。但是对于这两种情况,这两个词都应该是粗体。请给我解决这个问题的办法。

我有这个问题https://www.paraphraser.site/


共1个答案

匿名用户

参见下面的示例代码以供参考,您可以按照给定的示例执行:

preg_replace("/\w*?$kw\w*/i", "<b>$0</b>", $str1)

\w*?匹配关键字前的任何单词字符(尽可能少)和\w*关键字后的任何单词字符。

我建议您使用preg_quote来转义关键字:

preg_replace("/\w*?".preg_quote($kw)."\w*/i", "<b>$0</b>", $str1)

对于Unicode支持,请使用u标志和\p{L}而不是\w:

preg_replace("/\p{L}*?".preg_quote($kw)."\p{L}*/ui", "<b>$0</b>", $str1)

对于您的代码,您可以按如下方式执行:

        $keywords1 = array("stack","stack overflow");
    $keywords2 = array("stack overflow","stack");
    $str1 = "stack overflow";
    $str2 = "stack overflow";
    usort($keywords1, function($a, $b){
    return strlen($a) < strlen($b);
    });
    usort($keywords2, function($a, $b){
    return strlen($a) < strlen($b);
    });
    foreach($keywords1 as $kw){
        if (preg_match("~\b$kw\b~i", $str1)) {
            $str1 = preg_replace("/$kw\b/", "<b>$0</b>", $str1);
            // $str1 = str_replace($kw,'<b>'.$kw.'</b>',$str1);
            }
    }
    foreach($keywords2 as $kw){
        if (preg_match("~\b$kw\b~i", $str2)) {
            // $str2 = str_replace($kw,'<b>'.$kw.'</b>',$str2);
            $str2 = preg_replace("/$kw\b/", "<b>$0</b>", $str2);
            }
    }
    echo $str1;
    echo "<br>";
    echo $str2;

相关问题