Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 术语突出显示算法(HTML)_Php_Html_Algorithm - Fatal编程技术网

Php 术语突出显示算法(HTML)

Php 术语突出显示算法(HTML),php,html,algorithm,Php,Html,Algorithm,我知道有很多突出术语的问题被问到,但据我所知,没有人回答我的问题。搜索词被放入一个数组中 $keyarray = array("DE", "ABCD"); $string = "ABCDEF"; foreach ($keyarray as $value) { $string = str_ireplace($value, "<b>{$value}</b>", $string); } $keyarray=array(“DE”、“ABCD”); $string=“ABC

我知道有很多突出术语的问题被问到,但据我所知,没有人回答我的问题。搜索词被放入一个数组中

$keyarray = array("DE", "ABCD");
$string = "ABCDEF";
foreach ($keyarray as $value) {
   $string = str_ireplace($value, "<b>{$value}</b>", $string);
}
$keyarray=array(“DE”、“ABCD”);
$string=“ABCDEF”;
foreach($keyarray作为$value){
$string=str_ireplace($value,{$value},$string);
}
结果显然是ABCDEF而不是ABCDEF
因此,无论如何,我可以使用一个粗体标记,使用PHP以极快的速度突出显示这两个术语?

也许可以使用regexp,比如:
/de | acbd/
。正则表达式正在从左到右搜索,它不会返回,因此不会出现类似于
111111 2222

的情况。您可以尝试以下操作:

$keyarray = array("DE", "ABCD");
$string = "ABCDEF";
$words = explode(' ',$string);
foreach($words as &$w){
   foreach($keyarray as $criteria) {
        if(stripos($w,$criteria)!==false){
            $w = "<b>$w</b>";
                    break;//avoid duplicate wrapping
        }
   }
}
$string = implode(' ',$words);
$keyarray=array(“DE”、“ABCD”);
$string=“ABCDEF”;
$words=explode(“”,$string);
foreach($words as&$w){
foreach($keyarray作为$criteria){
if(stripos($w,$criteria)!==false){
$w=“$w”;
break;//避免重复包装
}
}
}
$string=内爆(“”,$words);
“极快”是一个相对术语。除此之外,您还有两个选择:

  • 正则表达式:如果你对正则表达式很在行,这是一个有效的用法。你也可以与他们一起向前看/向后看,这允许了相当大的灵活性

  • 逐字符分析:这通常是执行字符串操作的最佳方式(也是最快的),但创建字符串可能最耗时

  • 字符串替换;速度很快,但通常有一个边缘情况不能正常工作(从经验上讲)

在所有这些场景中,通过对术语列表进行适当的排序/分组/过滤,您可以从预先优化术语列表中获益。例如,将最大长度排序为最小长度将确保不会通过在长字符串中加粗一个较短的字符串来拆分长字符串(并错过匹配)


您还可以通过在开始替换之前检查所有搜索词来预先确定最佳正则表达式。同样,这将假设您非常熟悉正则表达式。

我不确定是否遵循。两个术语?目前只有一个匹配您的字符串…所以您希望您的结果是
ABCDE
?@Gordon感谢您注意到@Nev Stokes,两个术语都在字符串中,但只有一个匹配,在拼写更正@Henness之后,这是一个有效的答案,但只要它将所有提到的单词都加粗,就可以了。Regex是不可能的,算法必须与字符串替换一样快或更快。从长字符串到短字符串的排序很有帮助,但仍有像上面描述的那样的情况不起作用。(对速度影响不大)您能详细介绍一下逐字符分析方法吗?@vener-逐字符分析通常意味着将字符串一次向前读取到一个或多个缓冲区中,您可以对这些缓冲区执行廉价的测试。正如我在回答中所说的,这比查找/替换要困难得多,但它非常强大,因为您可以完全控制偷看与前进、匹配条件、提前跳过等。我最近用c#编写了一个XHTML解析器,它可以在5毫秒内完成一个相当大的页面并将其转换为对象模型。PHP字符串是一个字符数组,但不确定它在速度方面与C++/C#/Java相比如何。