4

だから私は小さなCMSを構築していて、コンテンツエディタでHTMLを許可しないようにしたいと思います。そのため、カスタマイズを改善するために、テキスト内の生のURLを検出し、BBのようなタグをサポートしたいと考えています。

www.example.com
[link http://www.example.com]Click me[/link]

残念ながら、私は正規表現にかなり慣れていないので、これを機能させることができないようです。文字列に対して2つの正規表現を実行しています。1つ目は生のURLを検出し、2つ目はBBのようなURLを検出します。後者は完全に正常に機能しているようですが、前者は干渉し、タグでラップされたURLも変換します。

ここで見つけたコードから始めて、いくつか追加しました。

タグなしのURLのコードは次のとおりです。

/* don't match URLs preceeded by '[link ' */
(?<!\[link\s)
(
    /* match all combinations of protocol and www. */
    (\bhttps?://www\.|\bhttps?://|(?<!//)\bwww\.)

    /* match URL (no changes made here) */
    ([^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/)))

    /* but don't match if followed by [/link] - THIS DOESN'T WORK */
    (?!\[/link\])
)

単語の文字ではないwww.ので、前のネガティブな後ろ姿があり、それがないと次のようなものになります/

 [link http://www.example.com]example[/link]

後も一致しhttp://ます。

上記の正規表現は次の一致を生成します(http://gskinner.com/RegExr/でテスト済み、一致は太字http://で示されています。これ以上URLを投稿することは許可されていないため、後にスペースを追加する必要がありました)。

www.example.com
http:// www.example.com http://example.com
[
リンクhttp://www.example.com]問題なし1[/link]
[リンクwww.example.com]問題なし2 [/ link]
[link http://www.example.com] http://www.example.com [/ link ]

私はネガティブな先読みを動かしてかっこで遊んでみましたが(かなり目的もなく)、成功しませんでした。

完全を期すために、タグマッチング正規表現(これは機能しているようです)を次に示します。

(?:\[link\s)(\bhttps?://|\bwww\.|\bhttps?://www\.)([^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/)))\](.*)(?:\[/link\])

誰かがすぐにエラーを見つけることができると確信しています。

よろしくお願いします!

4

1 に答える 1

0

私はあなたの正規表現を取り、あなたが与えた例でそれを正規表現に挿入し、それを機能させることを試みました。

ステップバイステップ:

1)元の正規表現: http: //regexr.com?33snj。この正規表現が[/link]とも一致する理由は、URL一致ビットにあります。

[^\s()<>]+

これも角かっこ文字'['と一致するため、[/link]ビットが検出されても一致は停止しません。[文字は有効なURI文字であると主張することができますが、それはまれな条件下でのみ発生します(詳細については、このstackoverflowの投稿を参照してください)。

2)正規表現を続行することにしましたが、否定文字リストに開き角かっこ文字を追加しました。

[^\s()<>[]+

これにより、別の問題が発生します。http://regexr.com?33snpを参照してください。バックトラックのために、エンジンは最後にネガティブな先読みを回避する方法を見つけます。

3)URLマッチンググループをアトミックにすると(キャプチャグループの先頭に?>を追加することにより)、エンジンはバックトラックを停止し、目的の結果に到達します。

(?<!\[link\s)((\bhttps?://www\.|\bhttps?://|(?<!//)\bwww\.)(?>[^\s()<>[]+(?:\([\w\d]+\)|([^[:punct:]\s]|/)))(?!\[/link\]))

実際の動作をご覧くださいhttp://regexr.com?33sns

于 2013-02-23T17:13:38.397 に答える