Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.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 正则表达式解析长URL_Php_Regex_Url - Fatal编程技术网

Php 正则表达式解析长URL

Php 正则表达式解析长URL,php,regex,url,Php,Regex,Url,我有一个正则表达式,它工作得很好,但不是在所有情况下都可以,例如,如果我有一个很长的url,比如说“http://www.gob.cl/especiales/politicas-y-propuestas-de-accion-para-el-desarrollo-de-la-educacion-chilena/“它只会回报我”http://www.gob.“作为url的一部分 这是我的密码 $regexUrl = "((https?|ftp)\:\/\/)?"; // SCHEME $r

我有一个正则表达式,它工作得很好,但不是在所有情况下都可以,例如,如果我有一个很长的url,比如说“http://www.gob.cl/especiales/politicas-y-propuestas-de-accion-para-el-desarrollo-de-la-educacion-chilena/“它只会回报我”http://www.gob.“作为url的一部分

这是我的密码

$regexUrl = "((https?|ftp)\:\/\/)?"; // SCHEME $regexUrl .= "([a-zA-Z0-9+!*(),;?&=\$_.-]+(\:[a-zA-Z0-9+!*(),;?&=\$_.-]+)?@)?"; // User and Pass $regexUrl .= "([a-zA-Z0-9-]+)\.([a-zA-Z]{2,3})"; // Host or IP $regexUrl .= "(\:[0-9]{2,5})?"; // Port $regexUrl .= "(\/([a-zA-Z0-9+\$_-]\.?)+)*\/?"; // Path $regexUrl .= "(\?[a-zA-Z+&\$_.-][a-zA-Z0-9;:@&%=+\/\$_.-]*)?"; // GET Query $regexUrl .= "(#[a-zA-Z_.-][a-zA-Z0-9+\$_.-]*)?"; // Anchor //if(preg_match_all("#\bhttps?://[^\s()]+(?:\([\w\d]+\)|([^[:punct:]\s]|/))#", $message, $matches1, PREG_PATTERN_ORDER)) //$pattern = '/((https?|ftp)\:(\/\/)|(file\:\/{2,3}))?(((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))|(((([a-zA-Z0-9]+)(\.)?)+)(\.)(com|org|net|gov|mil|biz|info|mobi|name|aero|jobs|museum|[a-z]{2}))([\/][\/a-zA-Z0-9\.]*)*([\/]?(([\?][a-zA-Z0-9]+[\=][a-zA-Z0-9\%\(\)]*)([\&][a-zA-Z0-9]+[\=][a-zA-Z0-9\%\(\)]*)*))?/'; if(preg_match_all("/$regexUrl/", $urlMessage, $matches1, PREG_PATTERN_ORDER)) { try { foreach($matches1[0] as $urlToTrim1) { $url= $urlToTrim1; echo $url; } } catch(Exception $e) { $url="-1"; } } $regexUrl=“((https?| ftp)\:\/\/)?”;//计划 $regexUrl.=“([a-zA-Z0-9+!*(),;?&=\$\$\.-]+(\:[a-zA-Z0-9+!*(),;?&=\$\$\.-+)?”;/用户和通行证 $regexUrl.=“([a-zA-Z0-9-]+)\([a-zA-Z]{2,3})”;//主机或IP $regexUrl.=“(\:[0-9]{2,5}”);//港口 $regexUrl.=“(\/([a-zA-Z0-9+\$\-]\.?)+)*\/?”;//路径 $regexUrl.=“(\?[a-zA-Z+&\$\$\.-][a-zA-Z0-9;:@&%=+\/\$\.-]*)?”;//获取查询 $regexUrl.=“(#[a-zA-Z.-][a-zA-Z0-9+\$\U.-]*)?”;//锚定 //if(preg#u match#all(“#\bhtps?:/[^\s()])+(?:\([\w\d]+\)|([^[:punct:][\s]|/)”,$message,$matches1,preg#PATTERN\u ORDER)) //(2.3)以下(((25[0-5-0-5[0-5[0-9][0-9][0-9[0-4-0-4][0-4[0-0-4[0-0-4[0-4[0-4[0-4[0-4[0-0-4[0-4[0-9][0-4[0-4[0-4[0-4[0-4[0-4[0-4[0-4[0-4[0-4[0-4[0-4[0-4[0-4[0-4[0-4[0-4[0-4[0-4[0-4[0-4[0-4[0-4[0-4[0-4[0-9[0-4[0-4[0-4[0-4[0-4[0-4[0-4[0-4[0-4[0-4[0-4[0-4 124; mobi | name | aero | jobs | museum |[a-z]{2}]([\/][a-zA-Z0-9\.]*([\/][a-zA-Z0-9]+[\=][a-zA Z0 9\%(\])([\&][a-zA Z0 Z0 9]+[\=][a-zA Z0 Z0 9%.*)*)?/'; if(preg_match_all(“/$regexUrl/”,$urlMessage,$matches1,preg_PATTERN_ORDER)) { 尝试 { foreach($urlToTrim1匹配1[0] { $url=$urlToTrim1; echo$url; } } 捕获(例外$e) { $url=“-1”; } }
是否有一个通用正则表达式可以解析所有类型的URL。

您的主机或正则表达式的ip部分

"([a-zA-Z0-9-]+)\.([a-zA-Z]{2,3})"
不允许在内部最多有一个点。因此,“www.xyz.com”永远无法匹配

我不知道你的具体要求是什么,但你可以这样做

"([^/?#:]+)"

对于主机部分。

如何匹配以http://或https开头的所有内容://


((?:http | https)(?:\\/{2}[\\w]+)(?:[\\/\\\.])(?:[^\\s”]*)

以下是我从$text提取所有URL的方法:

preg_match_all('#(https?://[a-z0-9\.\-_\#%&=/?;,!:~@\$\+]+)#iu', $text, $m);
假设URL以https://或http://开头,然后可以将序列限制为一组特殊字符

然后我可以在
$m
上使用来获取URL的所有详细信息

编辑:另外,如果你正在解析文本,你可能需要检查句点(
)和其他标点符号在URL的末尾。我注意到,如果URL在句子的末尾,人们可能会在URL的末尾放一个
,例如

所以我做了这样的事情:

 if (($url[$pos]==='!') || ($url[$pos]==='.')) { // probably do not want these chars at the end of a url!
    $url = substr($url, 0, $pos);
 }

(1)
(?:http | https)
是不必要的冗长和低效;
https?
工作得很好。(2)
/
只需要在使用
/
作为正则表达式分隔符时进行转义;还有许多其他选项。(3)如果使用
'
而不是
,则不需要进行双重转义。”
作为字符串文字分隔符。(4) 在字符类中,
不需要转义,
不是“OR”运算符,它只匹配一个
(暗示了“OR”)。(5)
[/.]?
无论如何都是毫无意义的,因为
[^\s”]*
匹配这两个字符。(6)没有必要将整个正则表达式包装在
()
(…)我可以继续…;)好吧,它正确地匹配了OP提供的一个示例。如果URL总是用双引号括起来,你也可以,因为它们在问题的文本中是这样的,但我不认为OP的意思是这样的。(但我错了:你的正则表达式也匹配
http://www.gob.
中的
“http://www.gob.“
,这显然是错误的。)+1。如果最后匹配的字符是禁止字符之一,您还可以使用lookback强制正则表达式本身后退:
“#https?:/[a-z0-9.#\%&=/?;,!:~@$+-]+(?