perl正则表达式帮助 - 希望是一个简单的问题

时间:2011-06-22 16:40:12

标签: regex perl html-parsing

我很惭愧地承认,我对正则表达式很可怕......所以我在这里请求你的帮助:)

我有一个看起来像这样的html文件:

<table>
  <tr>
    <td sadf="a">
      <a href="">asdf</a>
    </td>
  </tr>
</table>

我想要做的事情,使用Perl正则表达式,删除td标记中所有内容的除了。所以我希望输出为:

<td sadf="a">
  <a href="">asdf</a>
</td>

请帮帮我。感谢

3 个答案:

答案 0 :(得分:3)

html解析器在这项任务上要好得多,但如果你坚持使用正则表达式,试试这个:

<td[\s\S]*?</td>

在结束标记</td>之前,它与尽可能少的任何字符匹配。

答案 1 :(得分:3)

尝试使用XML::Simple。正如其他人所指出的那样,你不能使用正则表达式来解析XML。

XML::Simple会将您的HTML转换为哈希结构。从那里,您可以轻松找到“td”元素,并将整个事物复制到另一个哈希引用。然后,您可以使用XML :: Simple将其重新转换为HTML。

XML :: Simple不能保证XML中的结构相同(尽管它在语法上是相同的)。但是,我很少将HTML转换为hashref并返回HTML。

答案 2 :(得分:1)

更简单的思考方法是,您希望使用正则表达式获取标记部分(而不是删除除标记部分之外的所有内容)。

在这种情况下,正则表达式很简单,对于第一行可能看起来像这样:例如:<td \w+?="\w*">(您可以匹配\ n来抓取多行块)。如果你不知道你的正则表达式究竟发生了什么变化就很难回答,但是如果你遵循像this one这样的引用你应该没问题。

此外,最好不要使用正则表达式(完全使用HTML解析器),如果它不仅仅是有限的特定抓取。我假设你知道你想要使用正则表达式,但是如果你手上有一个非常基本的搜索模式,那么你有更好的方法可以做到这一点。