我发现正则表达式有点令人困惑,所以我遇到了这个问题:
我需要在给定文本中的某些关键字上插入<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
我尝试了各种组合,但我仍然无法获得正确的模式。
谢谢!
答案 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>