2011-09-23 53 views
1

这是一个问题,我已经想出了如何解决,但我想以一种更简单的方式解决它...我试图改进为程序员。PHP:在字符串中加入重叠关键字的缺点

已经做了我的研究,并没有找到一个优雅解决以下问题:

我有一个关键字假设阵列搜索:

$keyword_array = array('he','heather'); 

和假设的字符串:

$text = "What did he say to heather?"; 

最后,一个假设的功能:

function bold_keywords($text, $keyword_array) 
{ 
    $pattern = array(); 
    $replace = array(); 

    foreach($keyword_array as $keyword) 
    { 
     $pattern[] = "/($keyword)/is"; 
     $replace[] = "<b>$1</b>"; 
    } 

    $text = preg_replace($pattern, $replace, $text); 

    return $text; 
} 

功能(不是太奇怪的)这样的事返回:

"What did <b>he</b> say to <b>he</b>ather?" 

因为它是不承认“海瑟”时,有在它的中间有一个大胆的标签。

我想最终的解决方案做的是,尽可能简单,返回以下两个字符串之一:

"What did <b>he</b> say to <b>heather</b>?" 
"What did <b>he</b> say to <b><b>he</b>ather</b>?" 

最后的一些条件:

- 我想最后的解决方案处理大量可能的关键字

- 我希望它能处理以下两种情况(线表示重叠字符串):

一个字符串吞噬其他的,像下面的两个例子:

- 他,石楠

- 打磨,并

或者一个字符串不吞噬其他:

- 夹带,培训

可能的方法来解决:

-A REG当然,无视在关键字标签

- 长的方式(即我试图避免):

*为每个关键字出现的所有搜索字符串,存储关键字的位置的数组(开始和结束)是粗体

*处理这个数组递归结合重叠的关键字,所以没有冗余

*添加粗体标记(从字符串的末端开始,以避免将信息从所述其他字符移位位置)

非常感谢提前!

回答

0

简单化和懒惰十岁上下的方法折顶我的头:

排序您的项目长度初始阵,降!没有更多的“不承认,因为已经有中间的标签”问题!

编辑:嵌套标签的问题,然后很容易通过扩展您的正则表达式的方式,> foo和foo <不再匹配。

0

需要更改您的正则表达式模式,以识别您搜索的每个“术语”后面跟有空格或标点符号,以便它不会将模式匹配应用于后跟字母数字的项目。

1

Example

$keyword_array = array('he','heather'); 
$text = "What did he say to heather?"; 
$pattern = array(); 
$replace = array(); 
sort($keyword_array, SORT_NUMERIC); 
foreach($keyword_array as $keyword) 
{ 
    $pattern[] = "/ ($keyword)/is"; 
    $replace[] = " <b>$1</b>"; 
} 

$text = preg_replace($pattern, $replace, $text); 

echo $text; // What did <b>he</b> say to <b>heather</b>? 
+0

谢谢您的回答。这看起来好像适用于特定的情况,但不喜欢在我提到的所有情况下都能正常工作。例如:$ keyword_array = array('heat','ather')。 –

+0

@Nathan假设您正在尝试构建一个真实世界的应用程序:您是否知道在嵌套或联锁粗体标记中没有Point? – vzwick

+0

@vzwick:我同意这不是一个好习惯......但是我认为大多数浏览器都不会“窒息”它......我只是在Firefox和Chrome上测试了一个例子,它似乎工作正常。 –