正则表达式:匹配HTML文件中的所有alt属性?

时间:2011-11-04 16:11:50

标签: php html regex alt

我一直在查看问题并更好地了解我的问题,但仍未找到答案。

我在PHP中遇到正则表达式问题。我正在尝试获取HTML文件的“alt”属性中的所有文本。我考虑了所有可能的标签名称(img,输入和区域)以及所有类型的可能性,例如字符之间的空格和换行符(如<img alt = "Hello">)。还必须注意匹配字符串可以用单引号或双引号括起来,并在其中包含其他(不同的)引号,例如:<img alt="Alan's picture"><img alt='Example for the word "hello" in the text'>

这对我来说变得很难(我是正则表达式的初学者)所以我只会告诉你我得到了什么。请注意,我正在尝试在字符类中使用backrefernce,我发现这是一种错误的做法(或者我认为)。

'/<\s*(?:img|input|area)\s[^>]*alt\s*=\s*("|\')([^\1>]*)\1[^>]*>/siU'

我也在StackOverflow中看到,有些人推荐像这样的东西使用HTML解析器,但我担心这种做法可能耗费多少资源。你认为这是一个更好的主意吗?谢谢!

2 个答案:

答案 0 :(得分:2)

使用解析器绝对是可行的方法。

正则表达式非常不适合此类任务,even Jon Skeet cannot parse HTML using regular expressions

答案 1 :(得分:0)

绝对应该使用解析器。这有几个原因:

  • HTML解析器库可以解释正则表达式遗漏的HTML(或其他格式错误的)HTML;例如,某些网页无法转义alt属性中嵌入的引号,例如alt='why can't I do this'
  • 解析器将能够自动处理转义字符;例如,alt="why&#32;the&#32;long&#32;space"
  • 此外,HTML解析器可能会提供速度和API优势

您可以查看StackOverflow问题Robust, Mature HTML Parser for PHP,了解有关哪些解析器值得使用的建议。