2012-02-23 20 views
0

プレーンテキストをURLに変換する際に少し問題があります。私が持っているのが好き何 が、私はこのようなテキストがある場合は、次のとおりです。www.google.comを、それはテキストをリンクに変換する - PHP正規表現の問題

<a href="www.google.com" target="_blank">www.google.com</a> 

に変換されます私は、正規表現のnoobののようなものだけど、私はこの試みた:

$description = preg_replace('@(www.([-\w\.]+[-\w])+(:\d+)?(/([\w/_\.#-]*(\?\S+)?[^\.\s])?)?)@', '<a href="$1" target="_blank">$1</a>', $description); 

説明varは、変換されていないURLを含むことができるテキストです。上記のコードでは

、私はリンクとしてこれを取得:

<a target="_blank">www.google.com</a> 

だから、hrefの一部が省略されます。これはRegExウィザードのためのケーキでなければならないので、事前に各ヘルプに感謝します。

プレーンテキストをURLに変換する別の(より良い)方法がある場合、あなたはそう言うことができ、私はそれを試してみます。

+0

私はコードを実行しようとしましたが、それは完全に動作します。どのPHPバージョンを使用していますか? – Roberto

+0

PHPバージョン5.2.17 – samn

+1

'$ description'のサンプル値を投稿できますか? – Roberto

答えて

0

解決策が見つかりました。本当にRegExとは何の関係もなく、正しかったです。私の同僚は、頭の中でjQueryのコード行を追加:

$("a").removeAttr('href'); 

をだから、明らかにhref属性が削除されていました。私はこれがphp/regexの問題であると確信していたので、私はこれを見ていませんでした。これを削除すると問題が解決しました。

これは愚かなエラーであり、これを解決することは不可能であることを認識しています。皆さん、助けてくれてありがとうございます。

1

<a href="www.example.com">www.example.com</a>は、最新のブラウザでは正しく機能しません。これは、hrefの値が現在のページのURL(例: http://example.com/www.example.com。プロトコルを指定する必要があります。 HTTP/HTTPSなど

FTP、HTTP、httpsで始まるすべてのテキスト "リンク" を交換し、あなたの場合にのみ、タグにHTMLで

hello <a href="http://example.com">http://example.com</a> 
<a href="https://graph.facebook.com">https://graph.facebook.com</a> 
<a href="http://www.example.com">http://www.example.com</a> 
<a href="http://www.google.com">www.google.com</a> 
+0

テキストは次のようなものです:www.google.com、このようにしたいのですが:? – samn

+0

http://をhref属性に追加することでwww URLを処理するためのコードを編集しましたが、今では誤検出が発生する可能性があります(私はテストしません) – scibuff

2

<?php 

    $pattern = '/(www|ftp|http|https|file)(:\/\/)?[\S]+(\b|$)/i'; 
    $string = 'hello http://example.com https://graph.facebook.com http://www.example.com www.google.com'; 

    function create_a_tags($matches){ 

     $url = $matches[0]; 
     if ('www' == $matches[1]){ 
      $url = 'http://' . $matches[0]; 
     } 
     $escaped = htmlspecialchars($matches[0]); 
     return sprintf('<a href="%s">%s</a>', $url, $escaped); 
    } 

    echo preg_replace_callback($pattern, 'create_a_tags', $string); 

?> 

プリントを提出すれば、以下の通り問題は、リンクがhttp://www.google.comのように完全修飾URLの代わりにwww.google.comを間違って指している場合、正しい置換は次のようになります:

$description = preg_replace('@(www.([-\w\.]+[-\w])+(:\d+)?(/([\w/_\.#-]*(\?\S+)?[^\.\s])?)?)@', '<a href="http://$1" target="_blank">$1</a>', $description); 
0

かなり前に、URLの検証と識別にさまざまなアプローチを比較しました。正規表現のtableを参照してください。

正規表現を削除し、代わりにgruber revisedを使用することをおすすめします。 A(PHP 5.3)のソリューションは、次のようになります。

<?php 

$string = 'hello 
http://example.com 
https://graph.facebook.com 
http://www.example.com 
www.google.com 
ftp://example.com'; 

$string = preg_replace_callback('#(?i)\b((?:[a-z][\w-]+:(?:/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'".,<>?«»“”‘’]))#iS', function($m) { 
    // use http as default protocol, if none given 
    if (strpos($m[0], '://') === false) { 
     $m[0] = 'http://' . $m[0]; 
    } 
    // text -> html is a context switch, take care of special characters 
    $_m = htmlspecialchars($m[0]); 
    return '<a href="' . $_m . '" target="_blank">' . $_m . '</a>'; 
}, $string); 

echo $string, "\n"; 
+0

根本的に間違っていることはありません彼が現在使用している正規表現では、生成されたマークアップは有効ではないようです(hrefのスキームではありません) – AD7six

+0

正規表現に何か問題があるとは言いませんでした。私はちょうど良い方があると説明しました。また、このソリューションはHTMLで使用するURLを墨塗りする唯一のソリューションです。言いたいことは私が思うことが大事です。あなたがもっと大きな画像を見ずにコアの質問に答えることだけに興味があるなら - 私のゲストであり、あなたが望むすべてをdownvoteしてください... – rodneyrehm

+0

これはうまくコンパイルされません、私はこのエラーを受け取ります:構文エラー:予期しないT_CONSTANT_ENCAPSED_STRING = preg_replace_callback( '#(?i)\ b(?:[az] [\ w - ] + :(?:1,3)| [az ...) – samn