当前位置:  开发笔记 > 编程语言 > 正文

如何匹配HTML中不在标签内的文本?

如何解决《如何匹配HTML中不在标签内的文本?》经验,为你挑选了2个好方法。

给出这样的字符串:

This is the foo link

...和像"foo"这样的搜索字符串,我想强调HTML文本中出现的所有"foo" - 但不在标签内.换句话说,我想得到这个:

This is the foo link

但是,简单的搜索和替换将不起作用,因为它将匹配标记的href中的部分URL.

因此,要以问题的形式表达上述内容:如何限制正则表达式以使其仅匹配HTML标记之外的文本?

注意:我保证有问题的HTML永远不会像任何病态一样:


编辑:是的,当然我知道CPAN中有复杂的库可以解析最令人发指的HTML,从而减少了对这种正则表达式的需求.在很多场合,这就是我会用的.但是,这不是其中之一,因为保持此脚本简短而没有外部依赖性非常重要.我只想要一行正则表达式.

编辑2:同样,我知道Template :: Refine :: Fragment可以解析我的所有HTML.如果我正在写一个应用程序我当然会使用这样的解决方案.但这不是一个应用程序.它只不过是一个shell脚本.这是一个一次性代码.在这种情况下,作为一个可以传递的单个自包含文件非常有价值."嘿,运行这个程序"是比一个简单得多的指令,"嘿,安装一个Perl模块,然后运行它 - 等等,什么,你以前从未使用过CPAN?好的,运行perl -MCPAN -e shell(最好作为根)然后它会问你一堆问题,但你真的不需要回答它们.不,不要害怕,这不会破坏任何东西.看,你不需要仔细回答每一个问题 - 只要一遍又一遍地进入.不,我保证,它不会破坏任何东西."

现在将上述内容扩展到大量用户,他们想知道为什么他们一直使用的简单脚本不再那么简单,当所有改变的是使搜索词变为粗体时.

因此,虽然Template :: Refine :: Fragment可能是其他人的HTML解析问题的答案,但这不是这个问题的答案.我只想要一个正则表达式,它适用于非常有限的HTML子集,实际上会要求脚本进行解析.



1> David Z..:

如果您可以绝对保证HTML中没有尖括号,而不是用于打开和关闭标记的尖括号,这应该有效:

s%(>|\G)([^<]*?)($key)%$1$2$3%g



2> jrockway..:

通常,您希望将HTML解析为DOM,然后遍历文本节点.我会使用Template :: Refine:

#!/usr/bin/env perl

use strict;
use warnings;
use feature ':5.10';

use Template::Refine::Fragment;

my $frag = Template::Refine::Fragment->new_from_string('

Hello, world. This is a test of foo finding. Here is another foo.'); say $frag->process( simple_replace { my $n = shift; my $text = $n->textContent; $text =~ s/foo//g; return XML::LibXML::Text->new($text); } '//text()', )->render;

这输出:

Hello, world. This is a test of <foo> finding. Here is another <foo>.

无论如何,不​​要使用正则表达式解析结构化数据.HTML不是"常规",而是"无上下文".

编辑:最后,如果你在程序中生成HTML,你必须在字符串上进行这样的转换,"UR DOIN IT WONG".您应该构建一个DOM,并且只在转换完所有内容后对其进行序列化.(但是,您仍然可以通过new_from_dom构造函数使用TR .)

推荐阅读
惬听风吟jyy_802
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有