http:// または www を <a href.. に置き換える方法PHPで
-
23-08-2019 - |
質問
この正規表現を作成しました
(www|http://)[^ ]+
すべてに一致する http://... または www.... しかし、機能するpreg_replaceの作り方がわかりません、試してみました
preg_replace('/((www|http://)[^ ]+)/', '<a href="\1">\1</a>', $str);
しかし、それは機能せず、結果は空の文字列です。
解決
区切り文字としてスラッシュを使用しているため、正規表現内のスラッシュをエスケープする必要があります。別の記号を区切り文字として使用することもできます。
// escaped
preg_replace('/((www|http:\/\/)[^ ]+)/', '<a href="\1">\1</a>', $str);
// another delimiter, '@'
preg_replace('@((www|http://)[^ ]+)@', '<a href="\1">\1</a>', $str);
他のヒント
、それはHTTPの両方で動作しますので、ケース・不感性を有効にするには、「i」のフラグを追加してください。例えば、混乱のコードを使用します:
preg_replace('!(www|http://[^ ]+)!i', '<a href="\1">\1</a>', $str);
まず他の回答で説明したように、あなたは脱出 - またはより良い、交換してください - 区切り文字をする必要があります。
preg_replace('~((www|http://)[^ ]+)~', '<a href="\1">\1</a>', $str);
次に、さらに正規表現を改善するためには、$n交換参照構文は、\\n
より好ましいです「>手動を。
preg_replace('~((www|http://)[^ ]+)~', '<a href="$1">$1</a>', $str);
第三に、あなたは不のみ物事を遅くされ、キャプチャ括弧を使用しています。それらを取り除きます。 $1
に$0
を更新することを忘れないでください。あなたは不思議に思っている場合、これらは非キャプチャ括弧は以下のとおりです。(?: )
preg_replace('~(?:www|http://)[^ ]+~', '<a href="$0">$0</a>', $str);
最後に、私は[^ ]+
の反対で短く、より正確な\S
、と\s
を置き換えます。 [^ ]+
にスペースを許可していないことに注意してくださいが、改行やタブを受け入れます! \S
にはありません。
preg_replace('~(?:www|http://)\S+~', '<a href="$0">$0</a>', $str);
あなたの主な問題は、あなたが括弧内のすべてを入れていることのようです。また、あなたは「/」をエスケープする必要があります。だから、これを試してみます:
preg_replace('/(www|http:\/\/[^ ]+)/', '<a href="\1">\1</a>', $str);
編集:それは実際に括弧が問題ではなかったようだ、私はそれを読み違えます。他の人も指摘したように脱出はまだ問題でした。どちらのソリューションが動作するはずです。
preg_replace('!((?:www|http://)[^ ]+)!', '<a href="\1">\1</a>', $str);
あなたがうまく動作しませんあなたのパターン内部/
を持つ、あなたのパターンの区切り文字として/
を使用しています。私は、パターンの区切り文字として!
を使用して、これを解決していますが、代わりにバックスラッシュを使用してスラッシュをエスケープできます。
私はまた、あなたが2つの括弧のキャプチャをしていた理由はどのような理由を見ていないので、私はそれらのいずれかを取り外します。
あなたの状況におけるトラブルの一部は、あなたが抑え警告で実行しているということです。あなたがerror_reporting(E_ALL)
ていた場合、あなたはPHPがあなたの正規表現であなたの区切り文字の問題について、生成しようとしているメッセージを見ていると思います。
は、\ Sを使用する必要があります。
preg_replace('/((www|http:\/\/)\S+)/', '<a href="$1">$1</a>', $val);