所以,我仍然是一个REGEX假人,过去两天才使用它们。但至少对我来说,我的问题似乎很奇怪。
以下模式为我正确匹配此字符串:
<td valign=3D\"top\">For:</td>(\\s)+(=)?(.|\r\n|\n)+<td>(([a-z]|[A-Z]|=|\\s)+)<br>
原始字符串(取自正在输入正则表达式的html文档作为输入):
<td valign=3D"top">For:</td> = <td>XXXXXX XXXXX<br>
和匹配的字符串:
<td valign=3D"top">For:</td> = <td>XXXXXX XXXXX<br>
但是对于这个字符串:
<td valign=3D"top">For:</td> <td>YYYYYYY= YYYYY<br>
它匹配整个html文档。我不明白为什么会发生这种情况,因为在(([a-z]|[A-Z]|=|\\s)+
我指定应该有<br>
代码
答案 0 :(得分:2)
为非贪婪匹配添加指示的问号:
<td valign=3D\"top\">For:</td>(\\s)+(=)?(.|\r\n|\n)+?<td>(([a-z]|[A-Z]|=|\\s)+?)<br>
^ ^
修改强>
此外,您可以简化为字符类而不是使用替换:
<td valign=3D\"top\">For:</td>(\\s)+(=)?(.|[\r\n])+?<td>([a-zA-Z=\\s]+?)<br>
^^^^^^ ^^^^^^^^^^^^
我唯一的问题是,为什么\\s
在\r\n
不是...... {/ p>}时被转义
编辑2:
使用*
代替+
,例如,空格不是必需的;在这些情况下,非贪婪量词可能总是有用的:
<td valign=3D\"top\">For:</td>(\\s)*?(=)?(.|[\r\n])*?<td>([a-zA-Z=\\s]*?)<br>
^^ ------ ^- ------------^-
答案 1 :(得分:1)
使用正则表达式解析HTML是一个非常糟糕的主意。
在此处查看原因: RegEx match open tags except XHTML self-contained tags
即使在HTML中解析非常简单的事情,使用DOM Parser通常更清晰(更易读)且更不容易出错。如果您不熟悉REGEX的
,甚至更多