Php 匹配大多数URL的正则表达式需要改进

Php 匹配大多数URL的正则表达式需要改进,php,regex,function,url,double-quotes,Php,Regex,Function,Url,Double Quotes,我需要一个函数,它将检查字符串中的现有URL function linkcleaner($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()<&g

我需要一个函数,它将检查字符串中的现有URL

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

if(preg_match($regex, $url, $matches)) {
echo $matches[0];
}
}
正则表达式取自,他解决了创建匹配所有URL的正则表达式的问题。 不幸的是,我不能让它工作。问题似乎来自正则表达式内部的双引号或表达式末尾的其他点符号。 感谢您的帮助。
谢谢大家!

你需要用一个\

来逃避,你需要用一个\

杰克·曼尼的评论来逃避……史诗:D

在更严肃的注释中,它不起作用,因为您终止了中间的字符串文字。

要在字符串中包含双引号,需要使用\

所以,这条线将是

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

请注意,我也逃过了“危险”。这适用于定义两个单引号之间的字符串。

Jack Maney的评论…史诗:D

在更严肃的注释中,它不起作用,因为您终止了中间的字符串文字。

要在字符串中包含双引号,需要使用\

所以,这条线将是

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

请注意,我也逃过了“危险”。这适用于在两个单引号之间定义字符串的情况。

除了@tandu的答案外,php中的正则表达式还需要分隔符

最简单的方法是使用一个字符开始和结束模式,因为该字符没有出现在其中:

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

除了@tandu的答案外,您还需要php中正则表达式的分隔符

最简单的方法是使用一个字符开始和结束模式,因为该字符没有出现在其中:

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

我不知道你们是怎么读这个正则表达式的,因为读/修改它真的很痛苦

试试这不是一行,是的,但如果需要,它很容易理解和修改:

<?php
$re_proto = "(?:https?|ftp|gopher|irc|whateverprotoyoulike)://";
$re_ipv4_segment = "[12]?[0-9]{1,2}";
$re_ipv4 = "(?:{$re_ipv4_segment}[.]){3}".$re_ipv4_segment;
$re_hostname = "[a-z0-9_]+(?:[.-][a-z0-9_]+){0,}";
$re_hostname_fqdn = "[a-z0-9_](?:[a-z0-9_-]*[.][a-z0-9]+){1,}";
$re_host = "(?:{$re_ipv4}|{$re_hostname})";
$re_host_fqdn = "(?:{$re_ipv4}|{$re_hostname_fqdn})";
$re_port = ":[0-9]+";
$re_uri = "(?:/[a-z0-9_.%-]*){0,}";
$re_querystring = "[?][a-z0-9_.%&=-]*";
$re_anchor = "#[a-z0-9_.%-]*";
$re_url = "(?:(?:{$re_proto})(?:{$re_host})|{$re_host_fqdn})(?:{$re_port})?(?:{$re_uri})?(?:{$re_querystring})?(?:{$re_anchor})?";

$text = <<<TEXT
http://www.example.com
http://www.example.com/some/path/to/file.php?f1=v1&f2=v2#foo
http://localhost.localdomain/
http://localhost/docs/???
www....wwhat?
www.example.com
ftp://ftp.mozilla.org/pub/firefox/latest/
Some new Mary-Kate Olsen pictures I found: the splendor of the Steiner Street Picture of href… http://t.co/tJ2NJjnf
TEXT;

$count = preg_match_all("\01{$re_url}\01is", $text, $matches);
var_dump($count);
var_dump($matches);
?>

我不知道你们是怎么读这个正则表达式的,因为读/修改它真的很痛苦

试试这不是一行,是的,但如果需要,它很容易理解和修改:

<?php
$re_proto = "(?:https?|ftp|gopher|irc|whateverprotoyoulike)://";
$re_ipv4_segment = "[12]?[0-9]{1,2}";
$re_ipv4 = "(?:{$re_ipv4_segment}[.]){3}".$re_ipv4_segment;
$re_hostname = "[a-z0-9_]+(?:[.-][a-z0-9_]+){0,}";
$re_hostname_fqdn = "[a-z0-9_](?:[a-z0-9_-]*[.][a-z0-9]+){1,}";
$re_host = "(?:{$re_ipv4}|{$re_hostname})";
$re_host_fqdn = "(?:{$re_ipv4}|{$re_hostname_fqdn})";
$re_port = ":[0-9]+";
$re_uri = "(?:/[a-z0-9_.%-]*){0,}";
$re_querystring = "[?][a-z0-9_.%&=-]*";
$re_anchor = "#[a-z0-9_.%-]*";
$re_url = "(?:(?:{$re_proto})(?:{$re_host})|{$re_host_fqdn})(?:{$re_port})?(?:{$re_uri})?(?:{$re_querystring})?(?:{$re_anchor})?";

$text = <<<TEXT
http://www.example.com
http://www.example.com/some/path/to/file.php?f1=v1&f2=v2#foo
http://localhost.localdomain/
http://localhost/docs/???
www....wwhat?
www.example.com
ftp://ftp.mozilla.org/pub/firefox/latest/
Some new Mary-Kate Olsen pictures I found: the splendor of the Steiner Street Picture of href… http://t.co/tJ2NJjnf
TEXT;

$count = preg_match_all("\01{$re_url}\01is", $text, $matches);
var_dump($count);
var_dump($matches);
?>

“无法使其工作”不是内置的PHP错误消息。抱歉,错误是解析错误:语法错误,意外“,”在C:\…\config.PHP联机。。。。英语不是我的母语,有时我在解释我想说的内容时遇到问题。无法让它工作不是内置的PHP错误消息。对不起,错误是解析错误:语法错误,意外“,”in C:\…\config.PHP on line。。。。英语不是我的母语,有时我在解释我想说的话时会遇到问题。谢谢&@tandu我仍然收到一个错误警告:preg_match[function.preg match]:未知修饰符“\”在C:\wamp\www\…\config.php的第919行,我认为在php中,你需要在开始和结束处用相同的字符分隔正则表达式。我已经用/thank you&@tandu编辑了我的定界答案,但仍然得到一个错误警告:preg_match[function.preg match]:未知修饰符“\”在C:\wamp\www\…\config.php的第919行,我认为在php中,需要在开始和结束处用相同的字符对正则表达式进行定界。我已经用/@poncha编辑了我的答案来定界,但它没有出现在这个正则表达式模式中,这是这里唯一重要的事情。@jeroen它声称匹配所有的URL;不是吗?@poncha我没有很好地检查正则表达式,但是你可以采用白名单方法或黑名单方法。OP似乎采取了一种黑名单方法:[^。无论哪种方式,字符都不会出现在模式中,因此使用a作为分隔符是安全的。@poncha它不会出现在这个正则表达式模式中,这是这里唯一重要的事情。@jeroen它声称匹配所有URL;不是吗?@poncha我没有很好地检查正则表达式,但您可以采用白名单或黑名单的方法方法。OP似乎采用了黑名单方法:[^。无论哪种方式,字符都不会出现在模式中,因此使用a作为分隔符是安全的。您的答案是greate!这是唯一一个正确解析以下字符串的正则表达式:RT@JustBrelieve:@enn4xor:TBT Last summer.*http://t.co/LsasKwfe”你真可爱,你真可爱。我发现了一些问题$re_hostname_fqdn参数。它在我找到的一些新的玛丽·凯特·奥尔森图片中匹配玛丽·凯特作为URL:施泰纳街的壮丽图片href…http://t.co/tJ2NJjnf@Oleg$re_hostname_fqdn将与Mary Kate匹配,因为它可能是任何单词的主机名…,但为什么它与wito匹配ut proto..我将对此进行调查,感谢您的注意哦,您是对的…$re_hostname_fqdn实际上不应该拾取它,因为$re_hostname会拾取它,这需要一个proto。正在修复。@Oleg将$re_hostname_fqdn更改为[a-z0-9_]?:[a-z0-9_-]*[.][a-z0-9]+{1,};现在就试试你的答案是伟大的!这是唯一一个正确解析以下字符串的正则表达式:RT@JustBrelieve:“@enn4xor:TBT Last summer.*http://t.co/LsasKwfe”你真可爱,你真可爱。我发现了一些问题$re_hostname_fqdn参数。它在我找到的一些新的玛丽·凯特·奥尔森照片中匹配玛丽·凯特作为URL:斯泰纳街h 参考…http://t.co/tJ2NJjnf@Oleg$re_hostname_fqdn将与Mary Kate匹配,因为它可能是任何单词的主机名…,但为什么它与Without proto匹配。。我会调查的,谢谢你的注意哦,你是对的$re_hostname_fqdn实际上不应该拾取它,因为$re_hostname会拾取它,这需要在它之前有一个proto。正在修复。@Oleg将$re_主机名_fqdn更改为[a-z0-9_]?:[a-z0-9_-]*[.][a-z0-9]+{1,};。现在试试