如何使用正则表达式来匹配这个html标签?

时间:2011-07-15 00:10:02

标签: php regex

我似乎无法弄清楚我做错了什么......

我正在尝试找到

的匹配项
<cite>stuffhere</cite>

这是对的吗?

preg_match_all('<cite>(.*?)</cite>/ms', $str, $matches)

4 个答案:

答案 0 :(得分:3)

转义/

preg_match_all('/<cite>(.*?)<\/cite>/ms', $str, $matches);

答案 1 :(得分:2)

你的困惑不是你的错; PHP在这个领域非常奇怪。

在大多数编程语言中,您可以使用以下两种方法之一创建正则表达式对象。如果语言支持正则表达式作为第一类语言元素,则可以使用正则表达式文字:

var re = /<b>"\w+"<\/b>/;  // JavaScript

这里,正斜杠(/)是正则表达式分隔符;如果你想匹配文字/,你必须用反斜杠来逃避它:\/

在其他语言中,您必须以字符串文字的形式编写正则表达式,然后将其传递给构造函数或工厂方法:

Pattern p = Pattern.compile("<b>\"\\w+\"</b>");  // Java

正斜杠不需要转义,但双引号(")和反斜杠(\)都可以转义,因为它们在字符串文字中具有特殊含义。

但PHP是独一无二的:它不支持正则表达式文字,所以你必须把正则表达式写成一个字符串,但字符串必须看起来就像一个正则表达式文字!也就是说,它必须有字符串分隔符(引号)正则表达式分隔符。例如:

$re = '/<b>"\w+"<\/b>/';

这并不全是坏事;正如您所看到的,您可以使用PHP的单引号字符串而不是双引号,因此您不必转义所有反斜杠和双引号。您还可以选择不同的正则表达式分隔符,因此您不必在正则表达式中转义(例如)文字正斜杠:

$re = '~<cite>(.*?)</cite>~s'

修饰符(单行的's',忽略大小的'i'等)跟在尾随的正则表达式分隔符之后,如Perl或JavaScript。几乎任何ASCII标点字符都可以用作正则表达式分隔符; ~#是受欢迎的选择。

答案 2 :(得分:1)

您应该使用HTML Parser来解析html,否则最终会出现意外错误。但是,这正是你的正则表达式应该是:

'#<cite>(.*?)</cite>#s'

答案 3 :(得分:0)

试试这个:

preg_match_all('/<cite>(.*?)<\/cite>/ms', $str, $matches);