Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
突出显示与perl正则表达式匹配的HTML部分-在服务器端perl或客户端javascript中执行?_Javascript_Html_Regex_Perl_Web Applications - Fatal编程技术网

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

突出显示与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标记来破

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

s/($searchregex)/<span class="highlight">$1<\/span>/gi
s/($searchregex)/$1/gi
以突出显示匹配项。这对于纯文本的情况很好,但有时会因包含自身HTML标记的代码段而中断,例如,对于带有引用的链接或图像。在失败的情况下,上述替换通过在href值中插入span标记来破坏HTML链接

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

  • 编写一个正则表达式,该正则表达式不替换html标记内部的匹配项,例如内部。我不知道如何为这个案例编写替换正则表达式。是否有允许这种替换的perl正则表达式?它看起来是什么样子

  • 编写一个正则表达式,替换上述替换的所有错误替换。这将修复href中错误的span标记

  • 使用Javascript高亮显示生成的DOM树中的匹配项。中概述了使用jQuery的可能方法。即使是普通的Javascript也可能足够了。还有一些用于突出显示的特殊jQuery插件。我对Javascript还不熟悉,所以我也希望您能给我一些建议


  • 更好的解决方案是什么?最好的办法是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