0

Perl CGI 应用程序正在提供搜索功能。应用程序将匹配的片段写入 HTML 页面。现在我想突出显示片段中的匹配项。我可以使用类似的东西

s/($searchregex)/<span class="highlight">$1<\/span>/gi

突出比赛。这适用于纯文本情况,但有时会因包含自身 HTML 标记的片段而中断,例如链接或带有引用的图像。在失败的情况下,上述替换是通过在 href 值中插入 span 标签来破坏 HTML 链接。

目前我看到了三种可能的解决方案:

  1. 编写一个不替换 html 标记内匹配项的正则表达式,例如在 <> 内。我不知道如何为这种情况编写替换正则表达式。是否有允许这种替换的 perl 正则表达式以及它的外观如何?

  2. 编写一个正则表达式来替换上述替换的所有错误替换。这将修复 href 中错误的 span 标签。

  3. 使用 Javascript 突出显示生成的 DOM 树中的匹配项。使用 jQuery 的可能方式在带有匹配文本的高亮 html中进行了概述。即使是普通的 Javascript 也可能足够JavaScript 的 Regular Expression Flavor了。也有特殊的 jQuery 插件用于高亮高亮正则表达式。我是 Javascript 的新手,因此也欢迎提供更多建议。

最好的解决方案是什么?最好的方法是 1. - 但这似乎是不可能的。所以剩下的问题是:在服务器端以丑陋的方式完成工作,或者在客户端引入 Javascript 以更简洁的方式解决问题。

4

2 回答 2

1

您可以在服务器端使用 HTML 解析器,这是您正在做的工作的正确工具。

或者您可以按照您所说的使用 javascript 来完成,我更喜欢我自己,因为它更通用,并且可以带来更多的交互性,尽管您可能会面临与您现在所面临的类似的问题(只是您已经移动了它到客户端)。

这实际上是一个比最初看起来更复杂的问题。没有更多信息,就不可能尝试提出更好的解决方案。

一个好的解决方案是遍历 DOM 树并匹配每个文本节点,但是您会遇到一个问题,即您不会匹配跨越多个文本节点的文本 - 例如“John the Con Johnson”将不匹配搜索“ John the Con”,因为它们将位于不同的节点中。这对您来说可能是也可能不是问题,具体取决于您的用例。

于 2012-08-07T13:39:38.007 回答
1

在 perl 中带有前瞻模式

s/($searchregex)(?=[^>]*<)/<span class="highlight">$1<\/span>/gi

或更短

s/$searchregex(?=[^>]*<)/<span class="highlight">$&<\/span>/gi

但也许您需要读取字符串中的整个文件或将输入记录分隔符 ($/) 更改为 '<',因为如果正则表达式后跟除 '>' 和 ' 之外的任何字符序列,则它与模式匹配<' 因为将不匹配 if ($/="\n" 并且在模式和下一个 '<' 之间有一个换行符。

于 2012-08-07T14:45:31.257 回答