Grubers新的和改进的URL识别正则表达式

时间:2010-08-26 09:09:14

标签: php regex

我一直在尝试在php项目中使用grubers latest url matching regex

为了测试它,我把一些非常简单的东西放在一起:

$regex = "(?i)\b((?:[a-z][\w-]+:(?:/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:"'.,<>?«»“”‘’]))";

$array = pret_match_all($regex, $theblockofurltext);

print_r($array);

第一个问题是“会逃脱一个字符串,这取决于我将正则表达式包裹起来,所以我只是删除它。使用它是个人的,我永远不会”在任何地方附近的网址。这给我留下了一个新的正则表达式。

$regex = "(?i)\b((?:[a-z][\w-]+:(?:/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'.,<>?«»“”‘’]))";

Raring to go然后我运行了我的小脚本,它给了我以下错误:

Warning: preg_split() [function.preg-split]: Unknown modifier '\' in D:\wwwroot\xxx\index.php on line 14

不幸的是,我在学校的REGEX课程没有被教授到这个正则表达式要求的水平附近,我不知道从哪里开始修复这个用于PHP。任何帮助将不胜感激。毫无疑问,我可能也做了一些愚蠢的事情,所以请放轻松我:)

乔恩

2 个答案:

答案 0 :(得分:2)

在RE之前和之后添加#。

$regex = "#(?i)\b((?:[a-z][\w-]+:(?:/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'.,<>?«»“”‘’]))#";

答案 1 :(得分:1)

如果您使用PCRE,则必须将正则表达式括在delimiters中。现在,括号()也可以是分隔符,这就是引擎认为的原因,您的表达式只是(?i)并将下一个\解释为修饰符。

您可以使用~作为分隔符:

$regex = "~(?i)\b...]))~";

<强>更新

我不知道PHP是否支持使用(?i)部分修改表达式。所以你可能不得不删除它并将修饰符放在分隔符之后(无论如何你将它应用于整个表达式):

$regex = "~\b...]))~i";