簡體   English   中英

php preg_match,不適用於驗證URL

[英]php preg_match, not working for validating URL's

我有一個PHP preg_match正則表達式是:

#^(http:\/\/|https:\/\/|www\.|//)*(([A-Z0-9][A-Z0-9_-]*)(\.[A-Z0-9][A-Z0-9_-]*)+)(:(\d{1,5}))?([A-Z0-9_-]|\.|\/|\?|\#|=|&|%)*$#i

問題是當我嘗試匹配任何以.com &&結尾的URL時,它返回true,但是按預期它應該返回false,這可能是什么問題?

我將其用作:

    function isValidURL($url) {
        if (preg_match("#^(http:\/\/|https:\/\/|www\.|//)*(([A-Z0-9][A-Z0-9_-]*)(\.[A-Z0-9][A-Z0-9_-]*)+)(:(\d{1,5}))?([A-Z0-9_-]|\.|\/|\?|\#|=|&|%)*$#i", $url)) {
            return true;
        }else{
            return false;
        }
    }

並以以下方式訪問它:

$URL = $_GET['url'];
echo var_dump(isValidURL($URL));

現在,如果我以/url.php?url=http://www.google.com打開頁面,則返回true,如果我以/url.php?url=http://www.google.com**打開頁面/url.php?url=http://www.google.com**它返回false。 如果我以/url.php?url=http://www.google.com&&打開頁面,則返回true,但由於.com &&不是有效的TLD,它應該返回false。

最后一點

([A-Z0-9_-]|\.|\/|\?|\#|=|&|%)*

是匹配“&”號的東西。 您可能想做的是,如果有查詢字符串,則需要帶前綴的問號:

(\?([A-Z0-9_-]|\.|\/|\?|\#|=|&|%)*)?

但是,在PHP 5.2+中有一種更好的方法:

var_dump(filter_var('http://example.com', FILTER_VALIDATE_URL));

http://www.php.net/manual/zh-CN/filter.filters.validate.php

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM