2010-08-26 33 views
0

我一直试图在一个php项目中使用grubers latest url matching regexGrubers新的和改进的URL识别正则表达式

为了测试它,我扔在一起的东西很简单:

$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`!()\[\]{};:'.,<>?«»“”‘’]))"; 

铆足了劲去,我再跑到我的小脚本,它给了我下面的错误:

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

不幸的是我在学校正则表达式类是不教任何接近这个正则表达式的水平需要,我不知道从哪里开始解决这个与PHP一起使用。任何帮助将不胜感激。毫无疑问,我可能做一些愚蠢的事了,所以请去容易对我:)

乔恩

回答

1

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

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

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

更新:

我不知道PHP是否支持与(?i)表达式的局部修改。所以,你可能不得不删除这一点,并把修改的分隔符,而不是后(你将它应用到整个表达式反正):

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

+0

它。正则表达式现在正在完美运行。感谢您为什么它不工作的解释:) – JonB 2010-08-26 09:25:02

+0

@JonB:是的,我也试过了;) – 2010-08-26 09:26:34

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`!()\[\]{};:'.,<>?«»“”‘’]))#";