2012-03-21 30 views
18

Trong PHP, filter_var('www.example.com', FILTER_VALIDATE_URL) trả lại false. Điều này có đúng không? Không phải là www.example.com URL hợp lệ hoặc giao thức (http: //, ftp: //, v.v.) có cần phải được nêu rõ trong URL để chính xác không?FILTER_VALIDATE_URL có quá nghiêm ngặt không?

Trả lời

22

Đây không phải là URL hợp lệ. Những điều tiền tố với http:// không bao giờ là một điều rất thân thiện với người dùng, vì vậy các trình duyệt hiện đại cho rằng bạn có nghĩa là http nếu bạn chỉ cần nhập tên miền. Thư viện phần mềm, đúng, một chút cầu kỳ hơn!

Một cách tiếp cận bạn có thể thực hiện là chuyển chuỗi qua parse_url và sau đó thêm bất kỳ thành phần nào bị thiếu, ví dụ:

if ($parts = parse_url($url)) { 
    if (!isset($parts["scheme"])) 
    { 
     $url = "http://$url"; 
    } 
} 

Điều thú vị là, khi bạn sử dụng FILTER_VALIDATE_URL, nó thực sự sử dụng parse_url trong nội bộ để tìm ra những gì chương trình này là (view source). Nhờ có salathe cho đốm này trong các ý kiến ​​dưới đây.

+0

Cảm ơn bạn đã giải thích! Tôi sẽ sử dụng phương pháp 'parse_url' mà bạn đã nói, tôi thích nó hơn' filter_var' – federicot

+3

Trivia thứ tư: 'FILTER_VALIDATE_URL' sử dụng' parse_url() 'để kiểm tra xem có một lược đồ hay không. – salathe

+0

Rất tuyệt! Tôi sẽ thêm nó vào câu trả lời! –

3

URL phải tương ứng với các quy tắc được đặt trước trong RFC 2396 và theo thông số đó, giao thức là cần thiết.

1

Phần lược đồ ("giao thức") là bắt buộc đối với FILTER_VALIDATE_URL.

3

Ngoài câu trả lời của Paul Dixon tôi muốn nói rằng bạn có thể sử dụng flags cho FILTER_VALIDATE_URL để chỉ định phần nào của URL phải được trình bày.

FILTER_FLAG_SCHEME_REQUIRED 
FILTER_FLAG_HOST_REQUIRED 
FILTER_FLAG_PATH_REQUIRED 
FILTER_FLAG_QUERY_REQUIRED 

Kể từ PHP 5.2.1 FILTER_FLAG_SCHEME_REQUIREDFILTER_FLAG_HOST_REQUIRED cờ được sử dụng bởi mặc định và, thật không may, không có cách nào để vô hiệu hóa chúng (bạn không thể làm điều gì đó như filter_var($url, FILTER_VALIDATE_URL, ~FILTER_FLAG_SCHEME_REQUIRED); nếu sự tồn tại của phần thức truy cập URL không không cần thiết). Nó có vẻ như là một lỗi cho tôi. Có một thân nhân bugreport.

+0

Tôi ước điều này có hiệu quả, nhưng tôi thực sự không thể làm được. –

+1

Điều này dường như làm cho nó không xác nhận bất kỳ url. https://3v4l.org/1TjA5 – Derokorian

+0

@RussellSilva, Derokorian Bạn nói đúng, tôi không thể làm cho nó hoạt động. Nó trông giống như một lỗi cho tôi. Tôi đã cập nhật câu trả lời của mình. –

Các vấn đề liên quan