ウェブサイトでコメント欄を作っています。最初に、任意の 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 ライブラリを知っていますか?
前もって感謝します。