匹配标签中的多个术语

时间:2010-04-07 08:06:23

标签: html regex

我想匹配文档标记中搜索词(或搜索词列表)的任何匹配项。我目前的解决方案使用preg(在Joomla插件中)

$pattern = '/matchthisterm/i';
$article->text = preg_replace($pattern,"<span class=\"highlight\">\\0</span>",$article->text);

但这取代了文档HTML中的所有内容,因此我需要先匹配标记。这甚至是实现这一目标的最佳方式吗?

编辑: 好的,我使用过simplehtmldom,但只需要一些帮助就可以得到正确的术语。到目前为止我已经:

$pattern = '/(matchthisterm)/i';
$html = str_get_html($buffer);
$es = $html->find('text');
foreach ($es as $term) {
    //Match to the terms within the text nodes 
    if (preg_match($pattern, $term->plaintext)) {
        $term->outertext = '<span class="highlight">' . $term->outertext . '</span>';
    }
}

这使得整个节点文本变为粗体,我可以在这里使用preg_replace吗?

解决方案:

//Get the HTML and look at the text nodes
$html = str_get_html($buffer);
$es = $html->find('text');
foreach ($es as $term) {
    //Match to the terms within the text nodes
    $term->outertext = str_ireplace('matchthis', '<span class="highlight">matchthis</span>',         $term->outertext);
}

3 个答案:

答案 0 :(得分:3)

不,用正则表达式处理[X] [HT] ML主要是灾难性的。在您的示例的最简单的情况下,此输入:

<a href="/foo/matchthisterm/bar">bof</a>

给出了完全破碎的输出:

<a href="/foo/<span class="highlight">matchthisterm</span>/bar">bof</a>

正确的方法是使用正确的HTML / XML解析器(例如DOMDocument.loadHTMLsimplehtmldom),然后分别扫描和替换每个文本节点的内容。最后将HTML重新保存回字符串。

搜索词突出显示的替代方法是在JavaScript中执行此操作。由于浏览器已经将HTML解析为DOM,因此可以节省处理步骤。见例如。 this question举个例子。

答案 1 :(得分:1)

我同意使用正则表达式处理HTML不是一个好的解决方案。

我刚刚阅读了关于为什么正则表达式无法解析HTML的论点:RegEx match open tags except XHTML self-contained tags

我完全赞同这一切,但问题在于更简单:我们只需知道我们是否在某个HTML标记内。我们不必解析HTML结构并解释树和不匹配的标签或其他一些错误。我们只知道HTML标签之间是&lt;和&gt;。我相信正则表达式是一个非常好,适应和一致的工具。

这不是因为我们正在处理一些我们不想使用正则表达式的HTML。我们需要关注这里的真正问题,我认为这并不能真正处理HTML。我们只需要知道我们是否在标签内。我希望我不会为此得到太多的支持,但我完全承担了我的立场。

我正在将您重定向到之前的帖子(您在此处添加了此主题的链接)我今天发布的更快:Highlight text, except html tags

基于同样的想法,我希望我们知道我们需要的一切,你使用的是preg_replace(),其中像str_ireplace()这样的简单函数就足够了。如果您只需要替换字符串中的单词(或一组单词)并处理不区分大小写,请不要使用正则表达式。把事情简单化。 (我假设你没有简化你试图用来解释你的问题的替代品。)

答案 2 :(得分:0)

我没有使用过preg,但我之前在perl,java和actionscript中完成了模式匹配。如果这是类似的东西,你必须转义特殊字符。例如"\<span class...。我找到了一个关于使用preg的网站,如果你没有遇到这个网站,可以找到here