我似乎无法弄清楚我做错了什么......
我正在尝试找到
的匹配项<cite>stuffhere</cite>
这是对的吗?
preg_match_all('<cite>(.*?)</cite>/ms', $str, $matches)
答案 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);