0

重複の可能性:
テキスト内のURLをHTMLリンクに置き換えます

複数のURLを含む文字列変数を以下の関数に渡して、適切なHTMLリンクでのみ同じものを取得します。

public function convertUrlsToLinks($text){
    return preg_replace( '@(?<![.*">])\b(?:(?:https?|ftp|file)://|[a-z]\.)[-A-Z0-9+&#/%=~_|$?!:,.]*[A-Z0-9+&#/%=~_|$]@i', '<a href="\0" target="_blank">\0</a>', $text );
}

まったく機能しません。私は何が欠けていますか?

コードは、既存のリンク、<img>src値(またはそのようなもの)をスキップする必要があります。

4

1 に答える 1

0

すでに HTML ドキュメントがあると仮定して、URL の認識を次のように制限しました。

  • "で始まらない
  • http または www で始まる

私はこのような解決策を思いつきました:

$string = 'lorem ipsum www.foo.bar dolor sit <a href="http://fail.org">http://fail.org</a><img src="www.foo.bar"> amet http://abc.de.fg.com?bar=baz';
$rx = '%[^"](?P<link>(?:https?://|www\.)(?:[-_a-z0-9]+\.)+(?:[a-z]{2,4}|museum/?)(?:[-_a-z0-9/]+)?(?:\?[-_a-z0-9+\%=&]+)?(?!</a)(\W|$))%ui';
echo preg_replace_callback($rx, function($matches) {
    return '<a href="'.$matches['link'].'">'.$matches['link'].'</a>';
}, $string).PHP_EOL;

出力文字列は

lorem ipsum<a href="www.foo.bar ">www.foo.bar </a>dolor sit <a href="http://fail.org">http://fail.org</a><img src="www.foo.bar"> amet<a href="http://abc.de.fg.com?bar=baz">http://abc.de.fg.com?bar=baz</a>

正規表現は意図的に機能するはずです。あなたの文字列の例が役立ちます

于 2012-08-14T19:45:28.580 に答える