如何使用preg_match在包含特殊字符的字符串中查找URL

时间:2015-06-26 05:16:41

标签: php regex

我尝试了很多规则来找到一个带有preg_match()的网址,这对于普通的网址工作正常,但是当我尝试找到一个特殊字符的网址时,这个网址会被切断。

示例:

<?php 
$string = 'http://url.com/!abcd1234 http://url.com/#abcd1234 https://url.com/abcd1234 http://url.com/abcd1234 https://url.com/abc/d1234?123=123';
$rule='@(https?://([-\w\.]+[-\w])+(:\d+)?(/([\w/_\.#-]*(\?\S+)?[^\.\s])?)?)@';
$search = preg_match_all($rule, $string, $find);
foreach ($find[1] as $fn){
  echo $fn;
}
?>

返回:

http://url.com/!
http://url.com/#abcd1234
https://url.com/abcd1234
http://url.com/abcd1234
https://url.com/abc/d1234?123=123

似乎所有网址都很好用,但第一个确实是“http://url.com/!abcd1234”并且只返回到!焦炭。我想是因为! char是一种否定。

存在解决方案,不要出现这个问题?网址可以有!或不,这是我的问题,因为该规则应适用于所有人。

阅读要求:)

1 个答案:

答案 0 :(得分:2)

替换

$rule='@(https?://([-\w\.]+[-\w])+(:\d+)?(/([\w/_\.#-]*(\?\S+)?[^\.\s])?)?)@';

$rule='@(https?://([-\w\.]+[-\w])+(:\d+)?(/([\w/_\.#!-]*(\?\S+)?[^\.\s])?)?)@';

正在努力......