我是正规表达的新手,我需要一些帮助:)。
我有这个:
$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'。
我该怎么做?
答案 0 :(得分:5)
如果您使用/
作为delimiter,则需要在正则表达式中转义该字符的每个次出现。你没有:
/<img src="http:\/\/mi.url.com/iconos/oks/(.*)" alt="(.*)"\>/i
^
此处标记的/
被视为正则表达式的结束分隔符,后面的所有内容都被视为modifier。 i
是有效修饰符,但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代码中的引用不符合您的预期,则正则表达式可能会失败。