Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何使用preg_match查找包含特殊字符的字符串中的URL_Php_Regex - Fatal编程技术网

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

Php 如何使用preg_match查找包含特殊字符的字符串中的URL,php,regex,Php,Regex,我尝试了很多使用preg_match()查找url的规则,这对普通url很管用,但是当我尝试查找带有特殊字符的url时,例如!,url被剪切 例如: <?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?://(

我尝试了很多使用preg_match()查找url的规则,这对普通url很管用,但是当我尝试查找带有特殊字符的url时,例如!,url被剪切

例如:

<?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;
}
?>
似乎适用于所有URL,但第一个URL实际上是“”,只有在!烧焦我想是因为!char是一个否定词

存在一个解决方案来解决这个问题吗?URL可以有相同的名称!这是我的问题,因为这条规则应该适用于所有人

用于阅读的链接:)

更换

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


它正在工作…

不应该
在路径中使用时被转义?同样,似乎也能工作,在这种情况下,这是一个重复。工作很好,非常感谢!
$rule='@(https?://([-\w\.]+[-\w])+(:\d+)?(/([\w/_\.#-]*(\?\S+)?[^\.\s])?)?)@';
$rule='@(https?://([-\w\.]+[-\w])+(:\d+)?(/([\w/_\.#!-]*(\?\S+)?[^\.\s])?)?)@';