按模式检查URL的有效格式


Check URL for valid format by pattern

我有一个社会化书签网站,在这个网站中用户可以提交其他网站的链接(使用书签栏中的小册子或书签按钮,或通过直接方法添加url)

用户在浏览器中添加带有书签按钮的链接时遇到了一些url问题。包含"&"字符的url会出现这个问题。大多数在Mac或Windows上使用Safari的用户无法添加带有书签按钮的链接。

问题是所有带有"&"的url都以$isLink = preg_match($pattern, $url); // Returns false结尾(参见下面的代码)。

我删除了部分代码(请参阅代码片段中的注释),这就解决了问题。

但是我不想删除这个代码。我如何在不移除问题的情况下解决问题?

$url = htmlspecialchars(sanitize($_POST['url'], 3));
$url = str_replace('&', '&', $url);  
$url = html_entity_decode($url);
if (strpos($url,'http')!==0) {
    $url = "http://$url";
}
// check if URL is valid format
$pattern = '/^((['w]+:)?'/'/)?((['d'w]|%[a-fA-f'd]{2,2})+(:(['d'w]|%[a-fA-f'd]{2,2})+)?@)?(['d'w]([-'d'w]{0,253}['d'w])?'.)+['w]{2,4}(:['d]+)?('/([-+_~.,'d'w]|%[a-fA-f'd]{2,2})*)*('?(&?([-+_~.,'d'w]|%[a-fA-f'd]{2,2})=?)*)?(#([-+_~.,'/'d'w]|%[a-fA-f'd]{2,2})*)?$/';
// vvv I REMOVED FROM HERE vvv
$isLink = preg_match($pattern, $url); // Returns true if a link
// ^^^ UNTIL HERE ^^^
    if($url == "http://" || $url == "") {
        if(Submit_Require_A_URL == false) {
            $linkres->valid = true;
        } else {
            $linkres->valid = false;
        }
        $linkres->url_title = "";
    } elseif ($isLink == false) {
        $linkres->valid = false;
    } 

网站书签按钮代码为:

javascript:q=(document.location.href);void(open('http://website.com/submit.php?url='+escape(q),'_self','resizable,location,menubar,toolbar,scrollbars,status'));

为什么不使用PHP函数"filter_var()"来检查url:

$url = $_POST['url'];   
$isLink = filter_var($url, FILTER_VALIDATE_URL);