<?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/
参见下面的示例代码以供参考,您可以按照给定的示例执行:
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;