2

我只想向搜索引擎流量显示 Google AdSense 广告,而不向直接或来自 Facebook、Twitter、电子邮件链接等的常规访问者展示广告...

这是我目前使用的代码,它似乎可以正常工作,但我还想改进代码以包含除 Google 之外的许多其他搜索引擎,例如 Bing、Yahoo、Ask 等。有人介意看看下面的代码吗并对其进行改进?

<?php
$ref = $_SERVER['HTTP_REFERER'];
if (preg_match("(google|yahoo|bing)", $ref) != false) {
echo <<<END
<script type="text/javascript"><!--
google_ad_client = "xx-xx-xxxxxxxxxxxxxxxxxx";
/* xxxxxxxx xxxxxx xxx xxx xxx xx xxxxxx */
google_ad_slot = "xxxxxxxxxxxxxx";
google_ad_width = xxx;
google_ad_height = xxx;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</div>
END;
}
else {
     echo ""
;
}
?>
4

1 回答 1

4

代码看起来相当不错。我的建议是使用/而不是(作为模式分隔符,因为括号也可以用于匹配组。您还可以添加i标志以使您的匹配不区分大小写。不需要你的 else 语句,因为它只是输出和空字符串。您的 HEREDOC中还有一个额外的</div>标签END- 您要确保打开和关闭都在您的if语句内部或外部。

<?php
$referrer = $_SERVER['HTTP_REFERER'];
$my_domain = "example.com";
$search_engines = "google|yahoo|bing|altavista|digg";
$pattern = "((http(s)?:\/\/)(\w+?\.)?(?!{$my_domain})({$search_engines}))";
if (preg_match("/{$pattern}/i", $referrer) != false) {
    echo <<<END
    <script type="text/javascript"><!--
    google_ad_client = "xx-xx-xxxxxxxxxxxxxxxxxx";
    /* xxxxxxxx xxxxxx xxx xxx xxx xx xxxxxx */
    google_ad_slot = "xxxxxxxxxxxxxx";
    google_ad_width = xxx;
    google_ad_height = xxx;
    //-->
    </script>
    <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
    </script>
END;
} else {
    // Show something to visitors not referred by a search engine
}
?>

正则表达式模式会产生以下结果,匹配标记为*

FALSE - http://example.com/google
FALSE - http://example.com/google.com
FALSE - http://www.example.com/google.com
TRUE  - *http://google*.com/example.com
TRUE  - *http://www1.google*.com/example.com
TRUE  - *http://www.google*.com/example.com
TRUE  - *http://images.google*.com/page
TRUE  - *https://google*.com/example.com
TRUE  - *https://www.google*.com/example.com
于 2012-10-02T15:56:20.710 回答