我有一个非常简单的Perl函数,它返回我需要解析的自定义XML代码中的标记内容。但是,如果标签内部有行返回,则它返回一个空值,我不确定如何修复它:
sub in_tag
{
my ($text, $tag) = @_;
my ($content) = $text =~ m/<$tag.*>(.*)<\/$tag>/;
$content = $content . "";
return $content;
}
# works
print in_tag("<item><creation type=\"date\">2014-01-03</creation><name type=\"word\">John Doe</name><id type=\"number\">67</id></item>", "name");
# doesnt work
print in_tag("<item><creation type=\"date\">2014-01-03</creation><name type=\"word\">John\nDoe</name><id type=\"number\">67</id></item>", "name");
答案 0 :(得分:2)
要使.
正则表达式元字符与换行符匹配,您需要使用/s
标记:
m/..../s;
您还希望在正则表达式中使用非贪婪量词。在?
之后设置*
仍然匹配零或更多,但条件是它不会超出与模式的下一部分匹配的文本:
m/<$tag.*?>(.*?)<\/$tag>/
对于快速程序或小而简单的输入,我不介意这种简单的提取,但除此之外,我喜欢XML::Twig。需要一点时间来习惯,但是一旦掌握了它,你就可以毫不费力地做各种奇特的事情。