正则表达式匹配HTML中的属性?

时间:2009-01-21 11:30:26

标签: html regex parsing

我有一个txt文件,实际上是某个网页的html源代码。 在该txt文件中,有各种字符串,前面是“title =”标记。 例如

<div id='UWTDivDomains_5_6_2_2'  title='Connectivity Framework'> 

我有兴趣将连接框架文本引出并写入单独的文件。

像这样,有许多这样的标签,每个标题后面都有不同的文字='我需要提取的一些文字' 我想从html源文件/ txt文件中提取文本的所有此类实例,并写入单独的txt文件。文本可以包含小写字母,大写字母和数字。每个文本字符串的长度(以字符为单位)会有所不同。

我正在使用PowerGrep for windows。 Powergrep允许我使用正则表达式inout搜索文本文件。 我尝试使用搜索       标题='[A-ZA-Z0-9]

它显示正确的匹配,但它只匹配字符串的第一个字符,并且只写入与第二个txt文件匹配的文本字符串的第一个字符,而不是所有字符串。

我希望所有字符串都匹配并写入第二个文件。

正确的正则表达式或使用powergrep做我想做的事情的方法是什么?

-AD。

6 个答案:

答案 0 :(得分:6)

我只是不确定必须要求多少次正则表达式解析HTML文件的问题(并使用“使用DOM解析器”的正确解决方案来回答)。它每天都会出现。

困难是:

  • 在HTML中,属性可以包含单引号,双引号甚至没有引号;
  • 类似的字符串可以出现在HTML文档本身中;
  • 你必须处理正确的逃脱;和
  • 格式错误的HTML(不错的解析器对常见错误非常强大)。

因此,如果您满足所有这些(并且它是一个非常复杂但仍然不完美的正则表达式),它仍然不是100%。

HTML解析器存在是有原因的。使用它们。

答案 1 :(得分:3)

其他答案都对正则表达式进行了正确的更改,因此我将解释原始问题是什么。

方括号表示character class - 表示正则表达式将匹配这些括号内的任何字符。但是,与其他所有内容一样,它默认只匹配一次。正如正则表达式“s”仅匹配“ssss”中的第一个字符一样,正则表达式“[a-zA-Z0-9]”将仅匹配“Connectivity Framework”中的第一个字符。

通过添加repetition,可以重复匹配该字符类。最简单的方法是在它之后添加一个星号(它将匹配0或更多次出现)。因此,正则表达式“[a-zA-Z0-9] *”将匹配一行中的多个字符,直到它遇到不在该字符类中的字符(在您的情况下,空格字符,因为您没有在括号中包含该字符) 。

正则表达式准确地描述语法可能相当复杂 - 如果有人在属性中放置了非字母数字字符(例如&符号)会怎么样?您可以尝试通过使字符集“除引号字符之外的任何内容”来捕获引号之间的所有输入,因此“'[^']*'”通常会做正确的事情。通常你也需要记住逃避(例如,使用字符串'Mary\'s lamb'你实际上想要捕获中间的撇号,所以一个简单的“除撇号之外的所有”字符集都不会削减它)尽管谢天谢地根据规范,XML / HTML不是问题。

尽管如此,如果有一个现有的库可以为你进行提取,这可能比滚动你自己更快更正确,所以如果可能的话,我会倾向于这个。

答案 2 :(得分:2)

我不熟悉PowerGrep,但是,你的正则表达式是不完整的。试试这个:

title='[a-zA-Z0-9 ]*'

或更好:

title='([^']*)'

答案 3 :(得分:1)

我会使用这个正则表达式来获取title属性值

<[a-z]+[^>]*\s+title\s*=\s*("[^"]*"|'[^']*'|[^\s >]*)

请注意,此正则表达式将属性值表达式与引号匹配。因此,如果需要,您必须将其删除。

答案 4 :(得分:0)

这是你需要的正则表达式

title='([a-zA-Z0-9]+)'

但是如果你要做更多这样的事情,使用解析器可能会使它更加强大和有用。

答案 5 :(得分:0)

请改为尝试:

title=\'[a-zA-Z0-9]*\'