php - preg_match字符串不在href属性中

时间:2010-09-17 08:29:49

标签: php preg-match

我发现正则表达式有点令人困惑,所以我遇到了这个问题:

我需要在给定文本中的某些关键字上插入<b>标记。问题是,如果关键字在href属性中,则会导致链接断开。

代码是这样的:

$text = preg_replace('/(\b'.$keyword.'\b)/i','<b>\1</b>',$text);

对于像

这样的案例
this <a href="keyword.php">keyword</a> here

我最终得到:

this <a href="<b>keyword</b>.php"><b>keyword</b></a> here

我尝试了各种组合,但我仍然无法获得正确的模式。

谢谢!

3 个答案:

答案 0 :(得分:4)

您不仅可以使用正则表达式来执行此操作。它们功能强大,但它们无法像HTML那样解析递归语法。

相反,您应该使用现有的HTML解析器正确解析HTML。除非你包含一些文本实体,否则你只需要回显HTML。在这种情况下,您可以在回显之前在文本上运行preg_repace。

如果您的HTML是有效的XHTML,则可以使用xml_parse功能。如果不是,那么使用任何可用的HTML解析器。

答案 1 :(得分:0)

您可以在第一次替换后再次使用preg_replace从href中删除b标记:

$text=preg_replace('#(href="[^"]*)<b>([^"]*)</b>#i',"$1$2",$text);

答案 2 :(得分:0)

是的,您可以使用这样的正则表达式,但代码可能会有点吵架。 这是一个简单的例子

$string  = '<a href="keyword.php">link text with keyword and stuff</a>';
$keyword = 'keyword';
$text    = preg_replace(
               '/(<a href=")('.$keyword.')(.php">)(.*)(<\/a>)/', 
               "$1$2$3<b>$4</b>$5", 
               $string
           );

echo $string."\n";
echo $text."\n";

内部()内容存储在变量$ 1,$ 2 ... $ n中,所以我不必再重复输入内容。如果需要,匹配也可以更通用,以匹配不同类型的url语法。

看到此解决方案,您可能需要重新考虑计划在代码中匹配关键字的方式。 :)

输出:

<a href="keyword.php">link text with keyword and stuff</a>
<a href="keyword.php"><b>link text with keyword and stuff</b></a>