質問

私はそれを取りました 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'.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top