Gruber のリベラル URL 正規表現のハッキングを支援する
質問
私はそれを取りました Daring Fireball のリベラル URL 正規表現, とマージしました アラン・ストームのいくつかの改善 そして、括弧内の IDN 文字のサポートなどのいくつかのバグを修正する方法をハッキングしました。これが私が持っているものです:
/(?:[\w-]+:\/\/?|www[.])[^\s()<>]+(?:(?:\([^\s()<>]*\)[^\s()<>]*)+|[^[:punct:]\s]|\/)/
ただし、解決できないバグに遭遇しました。
'www.dsd(sd)sdsd.com' // can also be the valid 'www.dsd.com/whatever(whatever)'
上記URLは以下のように認識されています。 www.dsd(sd)sdsd.com'
(または www.dsd.com/whatever(whatever)'
) の代わりに www.dsd(sd)sdsd.com
(または www.dsd.com/whatever(whatever)
)。次の URL のように、これは URL に括弧が含まれている場合にのみ発生するようです。
'www.sampleurl.com'
として正しく認識されています www.sampleurl.com
.
私は思う の [^[:punct:]\s]|\/
URL に括弧が含まれている場合、正規表現の一部が実行されない, しばらく試してみましたが、解決策が見つかりません。誰か助けてくれませんか?
商品に関しては、 ルビュラーのパーマリンク 正規表現といくつかのテストデータを使用して (最後の URL は失敗します)。
Gruber の正規表現は少し急ぎすぎだったと思います。たとえば、次のような URL と一致しません。
http://en.wikipedia.org/wiki/Something_(Special)_For_You
その両方を見てさらに感動しました グルーバー そして アラン この本当に単純なタイプミスを見逃していました:
\([\w\d]+\)
しません \(\w+\)
足ります?:S
解決
のように思える グルーバーは正規表現を修正しました:
\b((?:[a-z][\w-]+:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.])(?:[^\s()<>]+|\([^\s()<>]+\))+(?:\([^\s()<>]+\)|[^`!()\[\]{};:'".,<>?«»“”‘’\s]))
他のヒント
www.dsd(sd)sdsd.com は有効なドメイン名ではありません。
持っていたら 'www.dsd.com/whatever(whatever)'
, 、正しく認識されます。(少なくとも私のテストではそうなっています)
/(?:[\w-]+:\/\/?|www[.])[^\s()<>]+(?:(?:\([^\s()<>]*\)[^\s()<>]*)+|[^[:punct:]\s]|\/)/
www. | | |
dsd | |
(sd) |
sdsd.com'
そうなると破綻してしまうと思うのですが…上記の正規表現の一部 (sd)
エスケープされた開き括弧で始まり、次にスター付き文字クラスが一致します sd
, 、次にエスケープされた右括弧、そして次は [^\s()<>]*
どれが一致するか sdsd.com'
.