RegEx匹配仅适用于某些查询的所有文本?

时间:2013-03-09 00:08:22

标签: php regex pattern-matching preg-match-all

我正在为一个客户端开发一个html解析器,我刚刚开始搞乱RegEx。我很陌生,但我很快就学会了!在这部分中,我需要获取文档中18.0pt大小的所有文本。这是我尝试过的第一个RegEx(使用实时RegEx测试器):

<p.*?><span.*?style='.*?font-size:1

这是我的测试文字:

<p class=MsoNormal><span style='font-size:14.0pt;font-family:"Comic Sans MS"'>3<sup>rd</sup>
Sunday in Lent - 2013c<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:14.0pt;font-family:"Comic Sans MS"'>Old
Testament – Isaiah 55:1-9<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:14.0pt;font-family:"Comic Sans MS"'>New
Testament – Luke 13:1-9<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:18.0pt;font-family:"Comic Sans MS"'><o:p>&nbsp;</o:p>
</span></p>

它正常工作并分别突出显示每一行,直到1. 问题是,当我将1更改为18时,而不是仅突出显示字体大小的行:18,它突出显示所有方式第一行直到18。我想用18pt字体抓住这一行。谢谢,任何帮助表示赞赏! :)

2 个答案:

答案 0 :(得分:2)

这是一个更好的正则表达式:

<p[^>]*>[ \t\r\n]*<span[^>]* style='[^']*font-size:18

你的一个人正如你所说的那样;找到<p,然后找到任意数量的任意字符,然后是><span,然后找到更多的任意字符,然后是font-size:18。因此它会找到第一个<p,然后找到所有任意字符,直到font-size:18。在第一个示例中,您很幸运,所有跨度都指定了字体大小。

这个版本不允许这么多;停在任何>。为了使其更加健壮,我允许<p><span>之间的空格。

答案 1 :(得分:0)

如果您匹配“除换行符之外的任何字符”,而不是匹配“任何字符”(带点),您将确保不会超出行尾:

<p.*?><span[^\n]*?style='[^\n]*?font-size:18

现在通常.与换行符不匹配,除非设置了某些标志(这取决于您的环境) - 特别是s标志。这可能是你的正则表达式测试人员的默认设置吗?

另一个想法是限制您期望与{}匹配的字符数 - 例如

<p.{,20}>

只要您的<p>代码标记中的字符不超过20个,就会有效。