Düzgün bir IDN URL Eşleştirme

3 Cevap php

I need help building a regular expression that can properly match an URL inskimlike free text.

  • scheme
    • Aşağıdakilerden biri: (? ftps bir protokoldür) ftp, http, https
  • İsteğe bağlı user (ve isteğe bağlı pass)
  • host (with support for IDNs)
    • (IDN'lerin desteği ile) www ve sub-domain(s) için destek
    • TLD'lerin temel filtreleme ([a-zA-Z]{2,6} yeterli ben düşünüyorum)
  • isteğe bağlı port numarası
  • path (isteğe bağlı, Unicode karakter desteği ile)
  • query (isteğe bağlı, Unicode karakter desteği ile)
  • fragment (isteğe bağlı, Unicode karakter desteği ile)

Burada alt etki alanları hakkında bulabildiğim budur:

A "subdomain" expresses relative dependence, not absolute dependence: for example, wikipedia.org comprises a subdomain of the org domain, and en.wikipedia.org comprises a subdomain of the domain wikipedia.org. In theory, this subdivision can go down to 127 levels deep, and each DNS label can contain up to 63 characters, as long as the whole domain name does not exceed a total length of 255 characters.

Etki alanı adı kendisi ile ilgili herhangi bir güvenilir kaynak bulamadık ama düzenli ifade for non-IDNs (bir IDN uyumlu sürümü yazmak için nasıl emin değilim) gibi bir şey olduğunu düşünüyorum:

[0-9a-zA-Z][0-9a-zA-Z\-]{2,62}

Can someone help me out with this regular expression or point me to a good direction?

3 Cevap

John Gruber, Daring Fireball ün, iyi bir URL tanıma regex bir dize için onun arayışı ayrıntılı o a post recently vardı. Ne diye geldi bu oldu:

\b(([\w-]+://?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/)))

Hangi görünüşte Unicode içeren URL'ler ile Tamam yok, de. Eğer aradığınızı geri kalanını almak için ona küçük bir değişiklik yapmak gerekir - düzeni, kullanıcı adı, şifre, ben kesinlikle gerekli vb Alan Fırtına wrote a piece explaining Gruber's regex pattern, (regex olduğunu böylece yazma-once-var-no-ipucu-how-to-okuma-ever-yine!).

Eğer protokol gerektiren ve yanlış pozitiflerin hakkında çok fazla endişeli değilseniz, bugüne kadar yapılacak en kolay şey, çevresindeki tüm boşluk olmayan karakterleri neticesinde :// olduğunu

Bu size orada yol en alırsınız. Eğer daha rafine gerekiyorsa test verileri veriniz.

(ftp|https?)://([-\w\.]+)+(:\d+)?(/([\w/_\.]*(\?\S+)?)?)?