我在尝试在HTML标头标记之间提取文本时遇到了实际问题。我有以下用于测试的Perl脚本:
#!/usr/bin/perl
my $text = '<html xmlns:v=3D"urn:schemas-microsoft-com:vml" xmlns:o=3D"urn:schemas- micr=osoft-com:office:office" xmlns:w=3D"urn:schemas-microsoft-com:office:word" =xmlns:m=3D"http://schemas.microsoft.com/office/2004/12/omml" xmlns=3D"http:=//www.w3.org /TR/REC-html40"><head><META HTTP-EQUIV=3D"Content-Type" CONTENT==3D"text/html; charset=3Dus-ascii"><meta name=3DGenerator content=3D"Micros=oft Word 14 (filtered medium)">This is a test</HTML>';
my $html = "Add this first";
$text =~ /(<html .*>)(.*)/i;
print $text . "\n";
我需要实现的是它之间的文本被提取到$ 1和剩下的$ 2。然后我可以使用print $ 1 $ myhtml $ 2
添加我的文本我无法让它发挥作用:(
答案 0 :(得分:4)
不要使用与结束.*
匹配的>
,而是尝试匹配除了结束[^>]*
之外的>
但是,一般来说,正则表达式不是解析HTML的正确方法。它只是不起作用。编写HTML的方式有很多变化,你会遇到很多荒谬的问题。
真正的解决方案是解析DOM树并找到你想要的那种方式。尝试使用XML parser。
答案 1 :(得分:0)
if ($subject =~ m!<html[^>]*>(.*?)</html>!) {
$result = $1;
}
注意事项。您的输入以html开头,以HTML结尾..这不可能。
此外,如果这是您正在考虑提取的ONLY标记,您可以使用正则表达式。但是,如果要从html / xhtml / xml等内部提取特定标记,则应考虑使用为此作业编写的无数模块之一。