2010-10-15 108 views
2

我知道有相当一些术语突出显示问题,但据我所知,没有人回答我的问题。搜索术语放入数组术语突出显示算法(HTML)

$keyarray = array("DE", "ABCD"); 
$string = "ABCDEF"; 
foreach ($keyarray as $value) { 
    $string = str_ireplace($value, "<b>{$value}</b>", $string); 
} 

结果显然将是ABC DE˚F而不是ABCDE˚F 所以它的存在,无论如何方式,我可以使用粗体标签极快的使用突出两个术语PHP?

+1

不确定我关注。这两个术语?目前只有其中一个匹配您的字符串... – 2010-10-15 08:02:59

+0

所以你想要你的结果是'ABC DE'? – Hannes 2010-10-15 08:04:43

+0

@Gordon谢谢你的注意 @Nev斯托克斯,这两个词都在字符串中,但只有一个匹配,在错字纠正后 @亨利这是一个有效的答案,但只要它将所有提到的词加粗就可以了。 – vener 2010-10-15 08:19:52

回答

0

也许使用类似的正则表达式:/de|acbd/。正则表达式是从左至右搜索和它不会回来,会出现像<b>1111<b></b>112222</b>

0

没有situtation你可以试试这个:

$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); 
1

“极快”是一个相对的概念。除此之外,你有几种选择:

  • 正则表达式:如果你对正则表达式非常好,这是对他们有用的。你也可以向前看/背后看,这可以提供相当大的灵活性。

http://www.regular-expressions.info/lookaround.html

  • 逐字符解析:这是经常做的字符串操作,最快的最好的方法,但可能是最耗时的创建。

  • String替换;速度很快,但通常有一个边缘案例无法正确工作(根据经验)。

在所有这些情况下,您可以受益于优化的前你的条件清单按排序/分组/过滤合适他们。例如,从最大长度到最小长度的排序可以确保您不会通过在其中加粗较短的字符串来拆分长字符串(并且错过匹配)。

您也可以通过在开始替换之前检查所有搜索词来预先确定最佳正则表达式。再次,这会假定你对正则表达式很了解。

+0

正则表达式不存在问题,算法必须像字符串替换一样快或更快。 从较长的字符串到较短的字符串排序有所帮助,但仍然有像上面描述的那种情况不起作用的情况(没有影响速度太快) 能否详细说明字符分析方法? – vener 2010-10-15 15:15:53

+0

@vener - 字符逐字符解析通常意味着通过一个字符将字符串一次一次转发到一个或多个缓存中,以执行经济的测试。正如我在我的回答中所说的那样,编写这个文件比编写查找/替换文件要困难得多,但它非常强大,因为您可以完全控制窥视与前进,匹配条件,跳过等等。我最近在C#中编写了一个XHTML解析器,它可以咀嚼大小相当的页面,并在5ms内将其转换为对象模型。 PHP字符串是一个char数组,但不知道它如何与C++/C#/ Java进行比较以获得速度。 – 2010-10-15 18:35:26