9

たとえば、mywebsite.com というシンプルなメッセージ ボードがあり、ユーザーはメッセージを投稿できます。現在、ボードはすべてのリンクをクリック可能にしています。誰かが次で始まる何かを投稿したとき:

http://, https://, www., http://www., https://www.

次に、スクリプトはそれらを自動的にリンクとして作成します (つまり、A href.. タグを追加します)。

問題 - スパムが多すぎます。したがって、私の考えは、上記の http|s/www を自動的に削除して、これらが「クリック可能なリンク」にならないようにすることです。ただし、ポスターが自分のサイト内のページにリンクできるようにしたいと考えています。メッセージに mywebsite.com へのリンクが含まれている場合は、http|s/www を削除しないでください。

私のアイデアは、2 つの配列を作成することでした。

$removeParts = array('http://', 'https://', 'www.', 'http://www.', 'https://www.');

$keepParts = array('http://mywebsite.com', 'http://www.mywebsite.com', 'www.mywebsite.com', 'http://mywebsite.com', 'https://www.mywebsite.com', 'https://mywebsite.com');

しかし、それらを正しく使用する方法がわかりません (おそらく str_replace が何らかの形で機能する可能性があります)。

以下は、投稿前と投稿後の $message の例です。

$message 前:

こんにちは、 http://mywebsite/aboutのおかげで、多くのことを学びました。http://www.bing.comhttps://google.com/search、および一部のwww.spamwebsite.com/refid=spammer2であなたを見つけました。

$message AFTER:

こんにちは、 http://mywebsite.com/aboutのおかげで、多くのことを学びました。bing.com、google.com/search、およびいくつかの spamwebsite.com/refid=spammer2 であなたを見つけました。


ユーザーが投稿フォームにクリア テキストを入力することに注意してください。したがって、スクリプトはこのクリア テキストでのみ機能する必要があります (href などではありません)。

4

4 に答える 4

1
$url = "http://mywebsite/about";
$parse = parse_url($url);

if($parse["host"] == "mywebsite")
    echo "My site, let's mark it as link";

詳細: http://php.net/manual/en/function.parse-url.php

于 2015-04-24T23:24:05.897 に答える
1

killSpam()機能の特徴:

  • 一重引用符と二重引用符で動作します。
  • 無効な HTML
  • ftp://
  • http://
  • https://
  • ファイル://
  • メールアドレス:

function killSpam($html, $whitelist){

//process html links
preg_match_all('%(<(?:\s+)?a.*?href=["|\'](.*?)["|\'].*?>(.*?)<(?:\s+)?/(?:\s+)?a(?:\s+)?>)%sm', $html, $match, PREG_PATTERN_ORDER);
for ($i = 0; $i < count($match[1]); $i++) {
    if(!preg_match("/$whitelist/", $match[1][$i])){
        $spamsite = $match[3][$i];
        $html = preg_replace("%" . preg_quote($match[1][$i]) . "%",  " (SPAM) ", $html);
    }
}

//process cleartext links
preg_match_all('/(\b(?:(?:(?:https?|ftp|file):\/\/|www\.|ftp\.)[A-Z0-9+&@#\/%?=~_|$!:,.;-]*[A-Z0-9+&@#\/%=~_|$-]|((?:mailto:)?[A-Z0-9._%+-]+@[A-Z0-9._%-]+\.[A-Z]{2,6})\b)|"(?:(?:https?|ftp|file):\/\/|www\.|ftp\.)[^"\r\n]+"|\'(?:(?:https?|ftp|file):\/\/|www\.|ftp\.)[^\'\r\n]+\')/i', $html, $match2, PREG_PATTERN_ORDER);

for ($i = 0; $i < count($match2[1]); $i++) {
     if(!preg_match("/$whitelist/", $match2[1][$i])){
        $spamsite = $match2[1][$i];
        $html = preg_replace("%" . preg_quote($spamsite) . "%",  " (SPAM) ", $html);
    }
}


return $html;

}

使用法:

$html = <<< LOB
 <p>Hello world, thanks to <a href="http://mywebsite.com/about" rel="nofollow">http://mywebsite/about</a> I learned a lot. I found
  you on <a href="http://www.bing.com" rel="nofollow">http://www.bing.com</a>, <a href="https://google.com/search" rel="nofollow">https://google.com/search</a> and on some <a href="http://www.spamwebsite.com" rel="nofollow">www.spamwebsite.com/refid=spammer2< /a >. www.spamme.com, http://morespam.com/?aff=122, http://crazyspammer.com/?money=22 and spam@email.com, file://spamfile.com/file.txt ftp://spamftp.com/file.exe </p>
LOB;

$whitelist = "(google\.com|yahoo\.com|bing\.com|nicesite\.com|mywebsite\.com)";

$noSpam = killSpam($html, $whitelist);

echo $noSpam;

スパムの例:

スパムの HTML をここに投稿することはできません。自分の killSpam() があると思います...- http://pastebin.com/HXCkFeGnでご覧ください

こんにちは、http://mywebsite/about のおかげで、多くのことを学びました。http://www.bing.com、https://google.com/search、および一部の www.spamwebsite.com/refid=spammer2 であなたを見つけました。www.spamme.com、http://morespam.com/?aff=122、http://crazyspammer.com/?money=22、spam@email.com、file://spamfile.com/file.txt ftp ://spamftp.com/file.exe


出力:

こんにちは、(SPAM) のおかげでたくさんのことを学びました。http://www.bing.comhttps://google.com/search、および一部の (スパム) であなたを見つけました。(SPAM) 、 (SPAM) 、 (SPAM) および (SPAM) 、 (SPAM) (SPAM)


デモ:

http://ideone.com/9IxFrB

于 2015-04-24T23:38:41.640 に答える
0

答えを探している人のために-問題を解決した関連する(より具体的な)質問を投稿しました:PHP-特定の単語で始まらない文字列から単語(http | https | www | .com | .net)を削除します

于 2015-04-27T03:31:49.410 に答える
0

リンクのテキストを保持したいが、「クリック不可」にしたい場合は、次のコードを試すことができます。

<?php

$text = <<<__text
   Hello world, thanks to http://mywebsite/about I learned a lot.
   I found you on http://www.bing.com, https://google.com/search and on some www.spamwebsite.com/refid=spammer2.
   www.spamme.com, http://morespam.com/?aff=122, http://crazyspammer.com/?money=22 and spam@email.com, file://spamfile.com/file.txt ftp://spamftp.com/file.exe
__text;
$allowed_domains = ['mywebsite.com'];

$pattern = "/((([A-Za-z]{3,9}:(?:\/\/)?)(?:[\-;:&=\+\$,\w]+@)?[A-Za-z0-9\.\-]+|(?:www\.|[\-;:&=\+\$,\w]+@)[A-Za-z0-9\.\-]+)((?:\/[\+~%\/\.\w\-_]*)?\??(?:[\-\+=&;%@\.\w_]*)#?(?:[\.\!\/\\\w]*))?)/";
preg_match_all($pattern, $text, $matches, PREG_SET_ORDER);
foreach ($matches as $m) {
    list(, $url, $scheme_and_domain, $scheme, $path) = $m;
    $domain = preg_replace(['/^' . preg_quote($scheme, '/') . '/i', "/^www./i"], '', $scheme_and_domain);

    if (in_array($domain, $allowed_domains)) continue;

    $url_prepared = rtrim("$domain$path", '/');
    $text = str_replace($url, $url_prepared, $text);
}

echo $text;

コードパッド

于 2015-04-25T02:33:59.317 に答える