【发布时间】:2013-08-17 19:33:24
【问题描述】:
我有以下字符串:
my $string = "<b>My Name: John Smith < /br> </br>Rest of a big text bla bla bla …";
我想把它分成 3 个字符串。
一个有“我的名字:”
一个有“约翰·史密斯”
还有一个拥有其余文本,即其余大文本 bla bla bla
问题是“约翰史密斯”是一个变体。 IE。可以是任何名称,我想提取它。
我试过类似:my @vals = split (/(<b>My Name: John Smith :*+<br >)/, $string);
但这甚至无法编译。
我如何在 Perl 中做到这一点?
【问题讨论】:
-
不要使用正则表达式解析 HTML。使用适当的 HTML 解析模块。 您无法使用正则表达式可靠地解析 HTML,并且您将面临悲伤和挫败感。一旦 HTML 与您的期望发生变化,您的代码就会被破坏。有关如何使用已经编写、测试和调试过的 Perl 模块正确解析 HTML 的示例,请参阅 htmlparsing.com/perl。
-
对于这样的有限用途,正则表达式很好,事实上,或多或少有必要做一些 HTML 解析器不能/不会做的事情(例如在“我的名称”在同一标签内)。这实际上并不是解析 HTML,只是模式匹配恰好在 HTML 中的文本。
-
@AndyLester:我没有解析页面。我只需要这个字符串。它不是一个完整的页面,否则我会按照你说的做
-
split要求您确定要返回的字符串之间的区别,但这在您的情况下很难确定,您仍然需要一些预处理或后处理来删除前导和尾随文本。split不是正确的选择。 -
为了解释@Sinan Ünür 的评论,在 HTML 中应该是
<br>,在 XHTML 中应该是<br></br>或<br/>。</br>单独在两者中均无效。
标签: regex perl html-parsing