“未知”修饰符“c”在正则表达式中的含义是什么?

时间:2010-10-20 08:56:05

标签: php regex

我是正规表达的新手,我需要一些帮助:)。

我有这个:

$url = '<img src="http://mi.url.com/iconos/oks/milan.gif" alt="Milan">';
$pattern = '/<img src="http:\/\/mi.url.com/iconos/oks/(.*)" alt="(.*)"\>/i';

preg_match_all($pattern, $url, $matches);

print_r($matches);

我收到了这个错误:

  

警告:preg_match_all()[function.preg-match-all]:未知修饰符'c'

我想选择'milan.gif'。

我该怎么做?

2 个答案:

答案 0 :(得分:5)

如果您使用/作为delimiter,则需要在正则表达式中转义该字符的每个次出现。你没有:

/<img src="http:\/\/mi.url.com/iconos/oks/(.*)" alt="(.*)"\>/i
                              ^

此处标记的/被视为正则表达式的结束分隔符,后面的所有内容都被视为modifieri是有效修饰符,但c不是(请参阅错误消息)。

所以:

/<img src="http:\/\/mi\.url\.com\/iconos\/oks\/(.*)" alt="(.*)"\>/i

但正如Pekka在评论中已经指出的那样,你不应该尝试在像HTML这样的非常规语言上使用正则表达式。请改用HTML解析器。看看Best methods to parse HTML

答案 1 :(得分:1)

问题是你没有转义url字符串中的正斜杠(你已经转义了http://部分中的正斜杠,而没有转义url路径。)

因此它遇到它的第一个(在.com之后),它认为是正则表达式的结束,因此它将该斜杠之后的所有内容视为“修饰符”代码。

下一个字符('i')是一个有效的修饰符(如你所知,因为你实际上在你的例子中使用它),所以通过测试。但是下一个字符('c')不是,所以它会抛出一个错误,这就是你所看到的。

要修复它,只需转义斜杠即可。所以你的例子看起来像这样:

$pattern = '/<img src="http:\/\/mi.url.com\/iconos\/oks\/(.*)" alt="(.*)"\\>/i';

希望有所帮助。

请注意,正如有人已经说过的,通常不建议使用正则表达式来匹配HTML,因为HTML可能太复杂而无法准确匹配。通常更喜欢使用DOM解析器。在您的示例中,如果alt属性或图像URL的结尾包含意外字符,或者HTML代码中的引用不符合您的预期,则正则表达式可能会失败。