【问题标题】:Bolding a keyword if found in a string如果在字符串中找到关键字,则加粗
【发布时间】:2022-01-23 15:59:03
【问题描述】:
<?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;

?>

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

我在https://www.paraphraser.site/ 上遇到了这个问题

【问题讨论】:

  • preg_replace("/\w*?$kw\w*/i", "$0", $str1);
  • 你不需要迭代数组,只需用'|' join()并使用一个 preg_replace_all() 替换所有匹配项。像这样: $regex = join('|', $keywords); preg_match_all("/($regex)/i", "$1", $str);
  • @Movs 它不起作用兄弟!
  • @NoumanAli 作为一个想法,你可以在它之前用空格符号分割你的所有键。你会得到这样的结果:“stack overflow”。这是代码: $keys=array(); foreach($keywords as $key){ $keys=explode(" ", $key); } $regex = join('|', $keys); echo preg_replace("/($regex)/i", "$1", $str);
  • @Movs 又没用了兄弟!

标签: php


【解决方案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("/\b$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("/\b$kw\b/", "<b>$0</b>", $str2);
            }
    }
    echo $str1;
    echo "<br>";
    echo $str2;

【讨论】:

  • 它现在仍在工作,兄弟。 !整个单词还没有变粗。
  • 它仍然给我相同的输出
  • 检查更新的代码,我为您的代码添加了 2 个排序功能,根据您的代码,如果字符串替换第一个字符串发生的情况是:首先它将替换“堆栈溢出”为“ Stack Overflow”,因为您在数组中的第二个工作是“Stack overflow”所以第一次替换后它将是“Stack Overflow”,所以第二次它不会匹配那个完整的单词。在第一个条件的第二个循环中,它会像“StackOverflow”一样替换为“Stack Overflow”,所以在第二次它会像“StackOverflow"
  • 像这样 stack 溢出 stack overflow
  • 你是否添加了以下代码: usort($keywords1, function($a, $b){ return strlen($a)
猜你喜欢
  • 2023-04-09
  • 2017-10-08
  • 2021-08-05
  • 2013-02-18
  • 1970-01-01
  • 2021-06-28
  • 2012-05-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多