正则表达式将html标记与特定内容相匹配

时间:2010-02-08 18:26:00

标签: php regex

我正在尝试编写正则表达式来捕获此字符串:

<td style="white-space:nowrap;">###.##</td>

如果包含正则表达式中的字符串,我甚至无法匹配它! 我正在使用preg_match_all(),但是,我找不到正确的模式。我在想"white-space:nowrap;"以某种方式抛弃匹配。任何的想法?谢谢......

4 个答案:

答案 0 :(得分:4)

为什么不尝试使用DOM文档呢?然后,您不必担心HTML格式正确。使用Dom Doc集合还可以提高可读性并确保快速性能,因为它是PHP Core的一部分,而不是生活在用户空间中

答案 1 :(得分:2)

当我遇到正则表达式问题时,我喜欢使用以下网站之一实时测试它们:

答案 2 :(得分:1)

你看到了什么警告吗?你必须逃避一些,即td close标签之前的/。这似乎对我有用:

$string='cow cow cow    <td style="white-space:nowrap;">###.##</td> cat cat cat cat';
php > preg_match_all('/<td style="white-space:nowrap;">###\.##<\/td>/',$string,$result);
php > var_dump($result);
array(1) {
  [0]=>
  array(1) {
    [0]=>
    string(43) "<td style="white-space:nowrap;">###.##</td>"
  }
}

答案 3 :(得分:1)

您是否知道任何PHP的preg_函数的正则表达式参数必须是双重分隔的?例如:

preg_match_all(`'/foo/'`, $target, $results)

'...'字符串分隔符,/.../ regex 分隔符,实际的正则表达式是foo。正则表达式分隔符不必是斜杠,它们只需要匹配;一些受欢迎的选择是#...#%...%~...~。它们也可以是平衡的包围字符对,例如{...}(...)[...]<...>;那些不太受欢迎,并且有充分的理由。

如果省略正则表达式分隔符,则正则表达式编译阶段可能会失败,错误消息可能没有意义。例如,此代码:

preg_match_all('<td style="white-space:nowrap;">###.##</td>', $s, $m)

...会生成此消息:

 Unknown modifier '#'

它尝试使用第一对尖括号作为正则表达式分隔符,并且>后面的任何内容作为正则表达式修饰符(例如,i表示不区分大小写,m表示多行)。要解决这个问题,你可以添加真正的正则表达式分隔符,如下所示:

preg_match_all('%<td style="white-space:nowrap;">###\.##</td>%i', $s, $m)

分隔符的选择取决于个人喜好和便利性。如果我使用了#/,我将不得不在实际的正则表达式中逃避这些字符。我逃脱了.因为它是一个正则表达式元字符。最后,我添加了i修饰符来演示修饰符的使用,因为HTML 不是区分大小写。