2013-12-13 37 views
0

我有一个需要删除标记内容的HTML代码。他们的人数约为30人。它是在HTML代码中的不同地方发现类似匹配字符串的第一次出现

<A class=tooltiplink href="javascript:void;" style="color:#000000"><img src="images/footnote.jpg" border="0"><SPAN style="margin:0 0 0 0px;"> unwanted info 4:6 </SPAN></A> 
<b>Hello </b> 
<A class=tooltiplink href="javascript:void;" style="color:#000000"><img src="images/footnote.jpg" border="0"><SPAN style="margin:0 0 0 0px;"> unwanted info 4:6 </SPAN> 
</A><b>World</b> 
<A class=tooltiplink href="javascript:void;" style="color:#000000"><img src="images/footnote.jpg" border="0"><SPAN style="margin:0 0 0 0px;"> unwanted info 4:6 </SPAN></A> 

所需的输出:的Hello World

当我尝试删除标签内容为$_=~s/A(.+)?\/A//gs;。它也占用了最后一个标签内的有用信息。除去g也有同样的效果。如何在没有第一个和最后一个匹配的情况下仅删除标签内容,并删除有用的信息。

+0

你有一些例子输入和输出的要求? – chooban

+0

我已经发布了示例代码。我只需要你好和世界。 – xtreak

+0

需要一些信息来给出一个通用的穷举答案:1)我认为这只是更大的html代码的一部分,可能有几个例子像你的样本。 2)我们如何定义(作为分隔符)是否与对应于您的第一个. 3) unwanted info is the one between first peer 的分隔符相对应4)我们能否假定该块总是在多行上或者也可能在1行中(并且在这种情况下需要更正) – NeronLeVelu

回答

1

你的问题是,正则表达式是贪婪的,即它匹配最长的匹配子字符串(从最前面的A到最后一个A)。尝试+运营商的非贪婪版本:

$_=~s/A(.+?)?\/A//gs; 

$_=~s/A(.*?)\/A//gs; 

顺便说一句,这里是你的正则表达式的<>字符?难道你不想找到<A>而不仅仅是A

你大概的意思

$_=~s/\<A\>.*?\<\/A\>//gs; 

在这里看到:How can I write a regex which matches non greedy?

点评:这不是解析使用正则表达式HTML一个好主意,因为太多可能出错(例如,与你的上述方法没有发现标签中有空格)。除非练习是针对临时问题的快速解决方案,否则请使用HTML解析器!

+0

如何在第一个子字符串本身停止它? @JohnB – xtreak

+0

我仍然收到链接内的内容。谢谢,我将尝试HTML解析器。但我不想要内的内容。那么HTML解析器可以忽略某些标签中的内容吗? @JohnB – xtreak

2

我认为,虽然你可以用正则表达式来做这件事,但这不是最好的方法。类似TreeBuilder和一些XPath会给你一个更可维护的解决方案。

一旦加载HTML到树结构中,需要的XPath可能是简单:

my $tree= HTML::TreeBuilder::XPath->new; 
$tree->parse_file("mypage.html"); 

my @nodes = $tree->find_nodes('//b'); 
相关问题