突出显示与perl正则表达式匹配的HTML部分 - 在服务器端perl或客户端javascript中执行此操作

Highlighting HTML parts matching a perl regex - do it in server side perl or client side javascript?

本文关键字:perl 客户端 服务器端 javascript 操作 执行 部分 显示 正则表达式 HTML      更新时间:2023-09-26

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

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

以突出显示匹配项。这适用于仅文本的情况,但有时会中断包含自身 HTML 标签的代码片段,例如用于带有引用的链接或图像。在失败的情况下,上述替换通过在 href 值内插入 span 标记来破坏 HTML 链接。

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

  1. 编写一个不替换 html 标记内部(例如<>内部)匹配项的正则表达式。我不知道如何为这种情况编写替换正则表达式。是否有一个perl正则表达式允许这种替换,它看起来像什么?

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

  3. 使用 Javascript 突出显示生成的 DOM 树中的匹配项。使用 jQuery 的可能方法在突出显示 html 中概述,并带有匹配的文本。即使是普通的Javascript也可能足够JavaScript的正则表达式风格。也有特殊的jQuery插件用于突出显示突出显示正则表达式。我是Javascript的新手,所以也非常感谢更多的建议。

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

在 perl 中具有前瞻模式

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

或更短

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

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

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

或者你可以像你说的那样使用 javascript 来做到这一点,我更喜欢我自己,因为它更通用,并且可能导致更多的交互性,尽管你可能会面临与你现在面临的类似的问题(只是你已经把它移到了客户端)。

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

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