2010-10-20 141 views
1

我是一个正则表达式的新手,我需要一些帮助:)。“正则表达式”中的“未知”修饰符“c”是什么意思?

我有这样的:

$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); 

而且我得到这个错误:

Warning: preg_match_all() [function.preg-match-all]: Unknown modifier 'c'

我想选择 'milan.gif'。

我该怎么做?

+3

如果您的输入数据不同,您应该使用DOM解析器而不是正则表达式来提取'src':请参阅http://stackoverflow.com/questions/3577641/best-methods-to-parse-html – 2010-10-20 08:58:06

+1

你忘了逃脱。 – Hannes 2010-10-20 08:58:34

回答

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 

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

+1

不错的一个。另一种方法是使用另一个分隔符,例如'#'... – 2010-10-20 09:08:06

1

问题是,你还没有逃脱url字符串中的正斜杠(你已经逃过http://部分中的那些,但没有url路径)。

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

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

要修复它,只需跳过斜线。所以你的例子看起来像这样:

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

希望有帮助。

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

相关问题