2

URL をリンクに自動的に変換し、Twitter@replyのユーザー名を Twitter プロファイルにリンクし、メール アドレスをmailtoプロトコルを使用したリンクに自動的に変換する PHP 関数を作成しました。

スクリプトは次のとおりです。

function autolink($a, $b){
        $e = "";
        $f = array(
            'link' => '~(http(s|)\:\/\/(www\.|)((\w+)\.(\w+)(\:[0-9]{2,5}|)\.[a-z]{2,5}|(\w+)(\:[0-9]{2,5}|)\.[a-z]{2,5}))((((\/|)\w+)(\.[a-z]{2,5}|))+)(\?(\w+\=\w+(\&|))+|)~',
            'email' => '~\w+\@\w+(\:[0-9]{2,5}|)\.[a-z]{2,5}~',
            'twitter' => '~\@([a-zA-Z_0-9]){1,15}~'
        );
    switch ($b) {
    case "link":$e = preg_replace_callback($f['link'], function ($a) {return '<a href="'.$a.'" rel="nofollow" target="_blank">'.$a.'</a>';},$a);break;
    case "email":$e = preg_replace_callback($f['email'], function ($a) {return '<a href="mailto:'.$a.'" rel="nofollow" target="_blank">'.$a.'</a>';},$a);break;
    case "twitter":$e = preg_replace_callback($f['twitter'], function ($a) {return '<a href="https://twitter.com/#!/'.str_replace('@','',$a).'" rel="nofollow" target="_blank">'.$a.'</a>';},$a);break;
    }
    return $e;
}

私が抱えている唯一の問題は、リンクを返す代わりに、「配列」という単語を返すことです。

たとえば、次のようになります。

autolink("This is my site http://weebuild.biz", "link");

これを返しています:

これは私のサイトの配列です

これを返す必要がある場合:

これは私のサイトです<a href="http://weebuild.biz" rel="nofollow" target="_blank">http://weebuild.biz</a>

元のスクリプトは、私が書いた JavaSript にもありました: http://jsfiddle.net/shawn31313/umgqR/2/

私は PHP 開発者ではないので、JavaScript バージョンにはさらにいくつかの機能があります。

おそらく問題は、JavaScript から正規表現を取得し、それを PHP に配置したことです。PHP の正規表現が JavaScript と異なるかどうかはわかりません。

前もって感謝します。

4

2 に答える 2

3

次の変更を試してください。

case "link":$e = preg_replace_callback(
        $f['link'],
        function ($a) {
            return '<a href="'.$a[0].'" rel="nofollow" target="_blank">'.$a[0].'</a>';
        },
        $a
     );
     break;

問題は、コールバックへの引数が文字列ではなく配列になることです。

ドキュメントから:

呼び出され、件名の文字列で一致した要素の配列を渡すコールバック。コールバックは置換文字列を返す必要があります。

于 2012-06-26T07:19:51.843 に答える
2

コールバックの$a内部は配列で、次のようなものを返します。

Array
(
  [0] => http://weebuild.biz
  [1] => http://weebuild.bi
  [2] => 
  [3] => 
  [4] => weebuild.bi
  [5] => 
  [6] => 
  [7] => 
  [8] => weebuild
  [9] => 
  [10] => z
  [11] => z
  [12] => z
  [13] => 
  [14] => 
  [15] => 

)

$a[0]の代わりにを参照することもでき$aます。もちろん、その値があることを確認し、それを参照するときに予期しないエラーを回避するために、いくつかのチェックを行う必要があります。

于 2012-06-26T07:22:37.873 に答える