我正在尝试突出显示字符串。他们是否在序列中。 像这样 -
$str = "star 5 hotel";
$keywords = "5 star hotels";
有我的功能。它只突出显示最后一个匹配的字符串。这里$str
包含搜索字符串。 $keyword
包含我已存储到数据库中的字符串
如何突出显示每个匹配的字符串。
function highlight($str, $keyword) {
$str = "star hotel 5";
$keyword = "5 star hotel";
foreach($look as $find){
if(strpos($keyword, $find) !== false) {
if(!isset($highlight)){
$highlight[] = $find;
} else {
if(!in_array($find,$highlight)){
$highlight[] = $find;
}
}
}
}
if(isset($highlight)){
foreach($highlight as $replace){
$str = str_ireplace($replace,'<b>'.$replace.'</b>',$keyword);
$stra[] = str_ireplace($replace,'<b>'.$replace.'</b>',$keyword);
echo "<pre>";
print_r ($stra);
echo "</pre>";
}
}
echo $str."<br>";
die();
return $str;
}
但是当我把它放到一个数组中并且当我打印这个数组$stra[]
时。它给了我这个
阵 (
[0] =&gt; 5 明星酒店
[1] =&gt; 5 星级酒店
[2] =&gt; 5星酒店
)
我找不到合并这些的方法。
输出 - 如果有正在搜索的关键字。然后必须突出显示..
5星级酒店
答案 0 :(得分:1)
您可以使用数组和strtr()
功能。 :)
$str = "the quick brown fox";
$keywords = "quick fox brown";
$matches = explode(" ",$keywords);
foreach ($matches as $v) {
$arr_matches[$v] = "<b>".$v."</b>";
}
$str = strtr($str, $arr_matches);
答案 1 :(得分:1)
这就是我的假设: -
我假设您要搜索给定字符串中搜索sting的每个单词,并且当且仅当找到所有单词时才生成粗体字符串(完整字符串)。
然后如下所示(评论中给出的解释): -
<?php
$search = "star 5 hotel"; //search string
$string = "5 star hotels"; // string in which you want to search
function highlight($search, $string) {
$new_search = array_unique(array_filter(explode(" " ,$search)));//explode search string
$found_count = 0; //create a counter
foreach($new_search as $find){ // iterate over search words array
if(strpos($string, $find) !== false) { // if word found in the string
$found_count +=1; // increase the counter
}
}
if(count($new_search) == $found_count){ //check that all words found in the string
$string = "<b>". $string ."</b>"; // if yes then make each word of the string bold
}
return $string; //return the newly modified string
}
echo highlight($search, $string); // echo newly modified string
输出: - https://eval.in/838325
答案 2 :(得分:1)
我知道它已经晚了但是这里有一种方法可以制作一个双循环来保持膨胀标记最小化并处理句子中的额外单词(我认为是正确的方式)。
检查单词是否在匹配列表中,如果是,则循环直到存在不匹配的单词 在这两个单词周围添加标签,然后返回主循环。
$str = "star 5 hotel";
$strarr =explode(" ", $str);
$keywords = "a 5 star uinique hotel";
$arr = explode(" ", $keywords);
For($i=0; $i < count($arr) ; $i++){
If(in_array($arr[$i], $strarr)){
$j=$i;
While(in_array($arr[$j], $strarr) && $j < count($arr)){
$j++;
}
$j--;
$arr[$i] = "<b>" . $arr[$i];
$arr[$j] = $arr[$j] . "</b>";
$i=$j;
}
}
Echo implode(" ", $arr);
以上示例的输出:
a <b>5 star</b> uinique <b>hotel</b>
答案 3 :(得分:0)
为什么不直接重复关键字并替换它们:
$str = "This is a star 5 hotel located in New York";
$keywords = array("5","star","hotels");
foreach (array_expression as $key => $value){
$str = str_replace($value, "<b>".$value."</b>", $str);
}
如果您没有双重关键字,那么简单且安全无瑕。
或者,如果您的关键字必须是以某种方式分隔的字符串:
$str = "This is a star 5 hotel located in New York";
$keywords = "5 star hotel";
$arraykeywords = explode(" ",$keywords);
foreach (array_expression as $key => $value){
$str = str_replace($value, "<b>".$value."</b>", $str);
}
要过滤双重关键字,请使用array_unique
:
$str = "This is a star 5 hotel located in New York";
$keywords = "5 star hotel star";
$arraykeywords = array_unique(explode(" ",$keywords));
foreach (array_expression as $key => $value){
$str = str_replace($value, "<b>".$value."</b>", $str);
}
经过大量关于正则表达式的讨论(参见评论),这是使用@Andreas&#39;正则表达式的方法:
$str = "This is a star 5 hotel located in New York";
$keywords = "5 star hotel star";
$pregsearch = "/".implode("|",array_unique(explode(" ",$keywords)))."/g"; //remove dups and join as regex
$str = preg_replace($pregsearch, "<b>$0</b>", $str);
只有在您搜索大字符串时才会建议。
答案 4 :(得分:0)
您可以使用数组来实现:
in_array
这会将字符串创建为数组,这意味着我们可以使用$MAXID = 0;
$row = $this->db->query('SELECT MAX(id) AS answerid FROM pa_it_answer')->row();
if ($row) {
$MAXID = $row->answerid;
}
进行检查,然后在if语句中执行任何操作:)
的引用: