突出显示与perl正则表达式匹配的HTML部分-在服务器端perl或客户端javascript中执行?
Perl CGI应用程序提供了搜索功能。应用程序将匹配的代码段写入HTML页面。现在我想突出显示片段中的匹配项。我可以用像这样的东西突出显示与perl正则表达式匹配的HTML部分-在服务器端perl或客户端javascript中执行?,javascript,html,regex,perl,web-applications,Javascript,Html,Regex,Perl,Web Applications,Perl CGI应用程序提供了搜索功能。应用程序将匹配的代码段写入HTML页面。现在我想突出显示片段中的匹配项。我可以用像这样的东西 s/($searchregex)/<span class="highlight">$1<\/span>/gi s/($searchregex)/$1/gi 以突出显示匹配项。这对于纯文本的情况很好,但有时会因包含自身HTML标记的代码段而中断,例如,对于带有引用的链接或图像。在失败的情况下,上述替换通过在href值中插入span标记来破
s/($searchregex)/<span class="highlight">$1<\/span>/gi
s/($searchregex)/$1/gi
以突出显示匹配项。这对于纯文本的情况很好,但有时会因包含自身HTML标记的代码段而中断,例如,对于带有引用的链接或图像。在失败的情况下,上述替换通过在href值中插入span标记来破坏HTML链接
目前,我看到了三种可能的解决方案:
更好的解决方案是什么?最好的办法是1但这似乎不可能。因此,剩下的问题是:在服务器端以一种丑陋的方式工作,或者在客户端引入Javascript以一种更干净的方式解决问题。您可以在服务器端使用HTML解析器,这是您所做工作的正确工具 或者你也可以像你所说的那样使用javascript,我更喜欢我自己,因为它更通用,并且可以带来更多的交互性,尽管你可能会面临与你现在面临的问题类似的问题(只是你已经将它移到了客户端) 事实上,这是一个比最初看起来更复杂的问题。没有更多的信息,就不可能想出更好的解决方案
一个好的解决方案是遍历DOM树并匹配每个文本节点,但是您有一个问题,即您无法匹配跨越多个文本节点的文本-例如,“John the Con Johnson”无法匹配搜索“John the Con”,因为它们将位于单独的节点中。这对您来说可能是问题,也可能不是问题,这取决于您的用例。在perl中使用了一种超前跟踪模式
s/($searchregex)(?=[^>]*<)/<span class="highlight">$1<\/span>/gi
s/($searchregex)(?=[^>]*]*“通过”你可以在服务器端使用HTML解析器,这是你正在做的工作的正确工具,或者像你说的那样使用javascript,我更喜欢javascript,因为它更通用,并且可以带来更多的交互性。@Billymon:对我来说,HTML解析器不值得为这项工作加载。它太重了。但是你能添加一个吗你的评论作为回答?我认为这正是你所需要的,但在客户方面:这一条看起来也很好:
s/$searchregex(?=[^>]*<)/<span class="highlight">$&<\/span>/gi