【问题标题】:How match and mark several keywords in string with php如何用php匹配和标记字符串中的几个关键字
【发布时间】:2017-05-12 15:36:09
【问题描述】:

这是我当前的代码:

# highlight keywords in string
function highlight($string, $keyword) {
    return preg_replace("/".preg_quote($keyword)."/ui", "<span class=\"h\">$0</span>", $string);
}

如果我执行这段代码:

$string = "The house is very big.";
echo highlight($string, "hous");

它会返回:

The <span class="h">hous</span>e is very big.

现在我尝试将几个关键字作为数组发送到函数的第二个参数,所有这些匹配项都应突出显示。示例:

echo highlight($string, array("hous", "big");

...应该返回:

The <span class="h">hous</span>e is very <span class="h">big</span>.

有什么想法吗?谢谢。

【问题讨论】:

  • 当你用highlight($string, array("house", "pan");调用它时会很有趣:会出现无效的HTML。

标签: php regex preg-replace


【解决方案1】:

检查$keywords 是否包含值数组而不是string 类型:

function highlight($string, $keywords) {
    $keywords  = is_array($keywords)
        ? implode('|', array_map('preg_quote', $keywords))
        : preg_quote($keywords);
    return preg_replace("/$keywords/ui", "<span class=\"h\">$0</span>", $string);
}

PHP live demo

【讨论】:

    【解决方案2】:

    你可以这样做:

    function highlight($string, $keywords) {
        return preg_replace("/".implode('|', $keywords)."/ui", "<span class=\"h\">$0</span>", $string);
    }
    
    $string = "The house is very big.";
    echo highlight($string, ["hous", "big"]);
    

    注意:implode('|', $keywords),因为| 管道符号可以让您拥有这种灵活性。

    如需了解更多信息,请参阅:http://www.regular-expressions.info/alternation.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多