2010-12-13 20 views
1

私はテキストフォームの投稿を解析する機能を持っています。投稿にリンクがあると、リンクをクリックする前に外部リンクについて警告するページにリダイレクトされます。PHP関数を書き直す手助けが必要

function url2link($txt) { 
    $setUrl = preg_replace("/(http:\/\/|(www\.))(([^\s<]{4,68})[^\s<]*)/", '<a href="/link/$2$3" rel="nofollow">$2$4</a>', $txt); 
    return $setUrl; 
} 

この機能を変更するには、リンクにドメインのチェックを追加する必要があります。リンクは、私自身のドメインからのものであれば、ちょうどこのようにクリック可能なリンクに変換:

$setUrl = preg_replace("/(http:\/\/|(www\.))(([^\s<]{4,68})[^\s<]*)/", '<a href="http://$2$3" rel="nofollow" target="_blank">$2$4</a>', $txt); 

が、それは外部のドメインへのリンクの場合 - 警告ページ(トップ一例)へのリンクポイントを作ります。

私はこのチェックを追加する方法がわからないため、ここではうまくいきません。ポストには複数のリンクがあり、一部にはローカル、いくつかの外部リンク、いくつかのミックスがあります。

+0

- このテキストは、複数のURLに遭遇する可能性のあるインラインテキスト(テキストエリアなど)の大きなブロックから取得されていますか?または、カンマで区切られたURLなどの専用フォームフィールドがありますか? – DeaconDesperado

+0

これはdbから来ています。 – santa

答えて

2

preg_replace_callbackを試してみてください。一致を処理して自分のドメインであるかどうかを判断できます。

+0

誰かが以前にそれを言いましたが、私はこの解決策を適用する方法を理解できませんでした... – santa

+0

ドキュメントを読んだことがありますか? – metrobalderas

+0

はい、私はもう一度やりましたが、私はそれを理解するには概念があまりにも異なっていると思います。私はそれがpreg_replaceのようなものに取って代わるものではないことを理解していますが、私はまだそれをどうするべきか不明です。 – santa

0

これは、preg_replace_callbackがこの場合に必要なものであることが分かりました。 php.netのドキュメントは吸う。私はそれが何であり、どのように機能するかを明確にした別の記事を見つけました。私は機能を変更しましたが、機能しません...何が欠けていますか?

function url2link($txt) { 

$checkDomain = preg_replace_callback('/(http:\/\/|(www\.))(([^\s<]{4,68})[^\s<]*)/', 'linkDomain', $txt); 

    function linkDomain($matches) { 

    $host = parse_url($matches[0], PHP_URL_HOST); 
    $host = ltrim($host, 'www.'); 

    if ($host == 'mydomain.com') { 
     $setUrl = preg_replace("/(http:\/\/|(www\.))(([^\s<]{4,68})[^\s<]*)/", '<a href="http://$2$3">$2$4</a>', $matches[0]); 
    } else { 
     $setUrl = preg_replace("/(http:\/\/|(www\.))(([^\s<]{4,68})[^\s<]*)/", '<a href="/link/$2$3" rel="nofollow">$2$4</a>', $matches[0]); 
    } 
    } 
    return $setUrl; 
} 
+1

あなたはなぜPHPのドキュメントが吸うと言うのですか?それは実際にそこにある最高のリソースの一つです。あなたが何か悪いことをしたいなら、facebookを見てください。とにかく、あなたは '$ txt'でまだ動こうとしているようですが、そうではありません。マッチが完了したので、あなたのlinkDomain関数で 'print_r($ matches)'を実行し、それを処理します。 – metrobalderas

+0

私はいつも参照としてphp.netを使用しますが、私はこの機能を理解できませんでした。私は正式に開発者として訓練されていない人がいると思います。はい、Facebookのドキュメントには多くの穴があります。とにかく、私は何か間違ったことをしているに違いない。私はprint_r($ matches)をlinkDomain($ matches)関数に置くことで配列の値を見ることさえできません。私はそれが壊れていると思うが、どこにはないかと思う – santa

+0

OK、上記を更新しました。まだ何かが不調で働いていません。 – santa

関連する問題