3

ウェブサイトでコメント欄を作っています。最初に、任意の URL を検索し、それを次のように置き換える正規表現を実行する必要がありました。

<a href="url"></a>  

そこで、コメント内のすべての URL を見つけるための超正規表現を見つけ、html タグですべての URL を返す関数を実行しました。

function addURLTags($string) {
    $pattern = "/(?i)\b((?:https?:\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'\".,<>?«»“”‘’]))/";
    return preg_replace($pattern, '<a href="$1">$1</a>', $string);
}

すべてがうまくいきました。しかし一週間前、私の上司はコメント欄に bbcode を追加しなければならないと言いました。そして、私は「問題ありません」のようでした...しかし、彼は、私の関数 addURLTags はそのままにしておく必要があると私に言いました。

したがって、次のような文字列:

http://www.google.com
[url]http://www.google.com[/url]
[url="http://www.google.com"]http://www.google.com[/url]

同じ文字列に置き換える必要があります:

<a href="http://www.google.com">http://www.google.com</a>

そこで、すべての bbcode の発生を html コードに置き換える小さな php ライブラリを入手しました。

そして、私は考えました:「OK、最初に[url]タグを持たないすべてのURLオカレンスを取得する必要があります。次に、すべてのbbcodeタグを置き換えます」

そして、スーパー正規表現の開始時に、次のような否定的なアサーションを追加しようとしました。

/(?i)\b((?![url])(?:https?://|www\d{0,3}[.]|[a-z0-9.-]+[.][ az]{2,4}/)(?:[^\s()<>]+|(([^\s()<>]+|(([^\s()<>]+))) ) ))+(?:(([^\s()<>]+|(([^\s()<>]+)) )|[^\s`!()[]{}; :'\".,<>?«»""'']))/

しかし、うまくいきませんでした!

私は正規表現の初心者であり、私が試したすべてのオンラインテスターは、このような長い正規表現ではうまく機能しません。他に何をしようとしているのかわかりません。

何か提案はありますか?[url] bbcode タグの有無にかかわらず「url 置換」を行う PHP ライブラリを知っていますか?

前もって感謝します。

4

2 に答える 2

1

ここで 2 つの問題を解決します。したがって、それらを個別に解決し、すべてを単一の正規表現にまとめないでください。これにより、多かれ少なかれ物事がより複雑になります。

分割統治:

最初に bbcode ライブラリを使用して、これらの URL がある部分を見つけ、テキストのストリームを作成できるようにします。

"normal text", "bbcode", "normal text", "bbcode"

次に、bbcode ライブラリを適用して「bbcode」セグメントのみに URL を作成すると、URL クリッカブル メーカーは「通常のテキスト」セグメントのみに適用されます。

すべてのセグメントが処理されたら、すべてを連結して 1 つの文字列に戻します。

出来上がり、問題は解決しました。

于 2012-04-14T14:28:52.663 に答える
0

最初にBBCodeを解析してから[url]、裸のURLをリンクにすることをお勧めします。これは、ネガティブルックビハインドを使用してURLの前に二重引用符がないことを確認することで簡単に実現できます。これが機能するのは、元の文字列の引用符がすでにに変換されているはず&quot;なので、URLの前の実際の引用符は、リンク作成者の一部としてそこに配置されている必要があります。

于 2012-04-14T13:49:49.543 に答える