"
iframe内などでは、パターンに応じてスペースではなくURLの前に通常のコードがあるため、コード自体はそれほど問題にはなりません。
ただし、ここでは別の解決策があります。<
単一または>
HTML内のコメントなどがある場合は、100%機能しない可能性があります。しかし、それ以外の場合は、うまく機能するはずです(そして、これがあなたにとって問題であるかどうかはわかりません)。>
ネガティブ先読みを使用して、開く前に閉じないことを確認し<
ます(これは、タグの内側にいることを意味するため)。
$content = preg_replace('$(\s|^)(https?://[a-z0-9_./?=&-]+)(?![^<>]*>)$i', ' <a href="$2" target="_blank">$2</a> ', $content." ");
$content = preg_replace('$(\s|^)(www\.[a-z0-9_./?=&-]+)(?![^<>]*>)$i', '<a target="_blank" href="http://$2" target="_blank">$2</a> ', $content." ");
この手法に慣れていない場合は、もう少し詳しく説明します。
(?! # starts the lookahead assertion; now your pattern will only match, if this subpattern does not match
[^<>] # any character that is neither < nor >; the > is not strictly necessary but might help for optimization
* # arbitrary many of those characters (but in a row; so not a single < or > in between)
> # the closing >
) # ends the lookahead subpattern
現在、正規表現内で使用しているため、正規表現の区切り文字を変更したことに注意してください!
。
タグの外側のURLにも最初のサブパターンが必要でない限り(\s|^)
、それも削除できるようになりました(そして、置換のキャプチャ変数を減らします)。
$content = preg_replace('$(https?://[a-z0-9_./?=&-]+)(?![^<>]*>)$i', ' <a href="$1" target="_blank">$1</a> ', $content." ");
$content = preg_replace('$(www\.[a-z0-9_./?=&-]+)(?![^<>]*>)$i', '<a target="_blank" href="http://$1" target="_blank">$1</a> ', $content." ");
そして最後に...最後にアンカーを含むURLを置き換えないつもりですか?例www.hello.com/index.html#section1
?誤ってこれを見逃した場合は#
、許可されたURL文字にを追加してください。
$content = preg_replace('$(https?://[a-z0-9_./?=&#-]+)(?![^<>]*>)$i', ' <a href="$1" target="_blank">$1</a> ', $content." ");
$content = preg_replace('$(www\.[a-z0-9_./?=&#-]+)(?![^<>]*>)$i', '<a target="_blank" href="http://$1" target="_blank">$1</a> ', $content." ");
編集:また、どう+
ですか%
?エンコードせずにURLに表示できる文字は他にもいくつかあります。これを参照してください。 編集終了
私はこれがあなたのためのトリックをするべきだと思います。ただし、(お持ちのコードを使用して)機能するURLと壊れたURLを示す例を提供できれば、すべてのケースで機能するようにテストされたソリューションを実際に提供できます。
最後に1つ考えます。適切な解決策は、DOMパーサーを使用することです。次に、すでに持っている正規表現をテキストノードにのみ適用できます。ただし、HTML構造に対する懸念は非常に制限されているため、問題は再び定期的になります(HTMLコメントまたはページ上のJavaScriptまたはCSSに一致しない「<」または「>」がない限り)。これらの特殊なケースがある場合は、実際にDOMパーサーを調べる必要があります。その場合、ここで提示されているソリューションはどれも(これまでのところ)安全ではありません。