php中strpos函數判斷字元存在誤區_PHP教程

來源:互聯網
上載者:User
在php中strpos是尋找字串首次出現的位置,如果存在就返回ture或相關具體數字,沒有就返回0或false了,但本人要用它做一個wordpress關鍵詞黑名單反垃圾評論時發現一些問題,下面我們來看看。

修改主題comments-ajax.php檔案

在主題目錄下的comments-ajax.php檔案中,大概60行左右的位置(剛取得使用者提交的評論表單中的$_POST['author']等欄位)。然後在該檔案中加上下面的代碼:

代碼如下 複製代碼

/*
* @Author: vfhky 2013年09月21日22:13
* @Variable string $word: 黑名單中的關鍵詞,使用者可自行按規律進行增加或減少
* @Variable string $comment_author: 使用者提交的$_POST['author']欄位值,表示暱稱
* @Variable string $comment_content: 使用者提交的$_POST['comment']欄位值,表示評論內容
**/
$words = "com,cn,info,net,www,http,cc,host,代理,移動,電,國,港,器,服,醫,肥,藥,農,信,貸,日,盈,網,票,域,銷,黃,司,企,機,租,人,錢,設,購,播";
$word = explode(',', $words);
$num = count($word);
for($i=0;$i< $num ;$i++){
if (strpos($comment_author,$word[$i],0) || strpos($comment_content,$word[$i],0)){
err( __('廣告必刪,多謝理解!') );
break;
}
}

4 後記

通過上面這段簡單代碼,我們就實現了提交對評論輸入的使用者暱稱、評論內容進行了黑名單中的關鍵詞的校正。一旦匹配到了上面的任何一個詞語,例如出現了www,那麼就提示使用者“廣告必刪,多謝理解!”,效果如所示。這樣算是又給部落格上了一道保險,增強了wordpress反垃圾評論的免疫力,而且還是非外掛程式的方法實現的喲!

上面看上沒問題,但是上午 @壞 童鞋一個邪惡測試,發現了上篇文章代碼的BUG。晚上下班回來,仔細看了下代碼,發現是自己對strpos函數的片面認識,因此做個筆記Mark一下。

2 strpos函數的原型

相信大家對strpos函數並不陌生,經常在字串的處理中能看到它的身影。strpos函數原型是:

/*
* @Para string $source: 在該字串中進行尋找[*]
* @Para mixed $target: 要尋找的字串;如若不是字串,將被轉換為整型並被視為字元的順序值[*]
* @Para int $offset: 尋找的起始位置
* @Return int/boolean: 成功則返回第一次出現的位置; 失敗返回 FALSE 值
**/
int strpos(string $source, mixed $target [, int $offset = 0 ]);

3 strpos函數的簡單測試

瞭解了strpos函數的原型之後,我們先來看一段簡單的測試代碼。

代碼如下 複製代碼
/*
* @Author: vfhky 2013年09月21日20:35
* @Description: 通過兩個不同的測試變數$test_1和$test_2直擊關鍵
**/
$words = "com,cn,info,net,www,http,cc,host,代理,移動,電,國,港,日,購";
$word = explode(',', $words);
$num = count($word);
$test_1 = "購買TT";
for($i=0;$i< $num ;$i++){
if (strpos($test_1,$word[$i],0)){
echo '廣告必刪,多謝理解!';
break;
}
}
echo "

----------This is $test_1 END----------

";

$test_2 = "壞壞購買TT";
for($i=0;$i< $num ;$i++){
if (strpos($test_2,$word[$i],0)){
echo '廣告必刪,多謝理解!';
break;
}
}
echo "

----------This is $test_2 END----------

";
?>

測試結果如所示:

再議wordpress反垃圾評論:都是strpos函數惹的禍


4 strpos函數的測試結果分析

上面這段代碼中有兩個不同的測試變數$test_1和$test_2,並且二者都包含了黑名單中的關鍵詞:購。但是顯示的測試結果來看,$test_1變數沒有別有效屏蔽,而變數$test_2卻被提示包含廣告詞。奧秘就在於變數$test_1和$test_2中的“購”字出現的位置就!當關鍵詞“購”出現在最前面時($test_1),strpos($test_1,$word[$i],0)函數的執行結果為0,因為“購”字在字串“購買TT”的最前面。那麼for迴圈中的if語句變成了if(0){},從而不會被視為垃圾評論,這就造成了BUG。下面分別是繼續用strpos函數和使用PHPRegex,兩種方法來實現“wordpress關鍵詞黑名單:反垃圾評論再升級”。
5.1 正確使用strpos函數修正BUG

代碼如下 複製代碼

/*
* @Author: vfhky 2013年09月24日20:06
* @Description: 正確使用strpos函數,解決上一篇文章代碼的BUG

**/
$words = "com,cn,info,net,www,http,cc,host,代理,移動,電,國,港,器,服,醫,肥,藥,農,信,貸,日,購,播";
$word = explode(',', $words);
$num = count($word);
for($i=0;$i< $num ;$i++){
if ( (strpos($comment_author,$word[$i],0) !== false) || (strpos($comment_content,$word[$i],0) !== false) ){
err( __('廣告必刪,多謝理解!') );
break;
}
}

5.2 使用PHPRegex修正BUG

代碼如下 複製代碼
/*
* @Author: vfhky 2013年09月24日20:06
* @Description: 使用PHPRegex修正BUG,實現“wordpress關鍵詞黑名單:反垃圾評論再升級(非外掛程式)”

**/
$words = "com,cn,info,net,www,http,cc,host,代理,移動,電,國,港,器,服,醫,肥,藥,農,信,貸,日,購,播";
$word = explode(',', $words);
$num = count($word);
for($i=0;$i< $num ;$i++){
if( preg_match("/$word[$i]/i", $comment_author) || preg_match("/$word[$i]/i", $comment_content) ){
err( __('廣告必刪,多謝理解!') );
break;
}
}

6 函數strpos的重要提醒

使用strpos函數還需要注意的一點就是:它可能返回布爾值 FALSE,但也可能返回等同於 FALSE 的非布爾值。
例如返回整型0,浮點型值0.0,Null 字元串,字串 "0",不包括任何元素的數組,不包括任何成員變數的對象,特殊類型NULL等等。
因此,應使用會檢查返回的值的類型的恒等運算子“===”來測試此函數的傳回值,而不是使用簡單的等號“==”來判別。

7Update 2013.09.26 22:27

經過 @星河大帝 的提醒,可以使用數組來代替字串,執行效率應該差不多。
7.1 使用strpos函數+數組修正BUG

代碼如下 複製代碼

$words = array("com","cn","info","net","www","http","cc","host","代理","移動","電","國","港","購");
$num = count($words);
for($i=0;$i< $num ;$i++){
if (strpos($comment_author,$words[$i],0) !== false || strpos($comment_content,$words[$i],0) !== false){
err( __('廣告必刪,多謝理解!') );
break;
}
}

7.2 使用正則式+數組修正BUG

代碼如下 複製代碼
$words = array("com","cn","info","net","www","http","cc","host","代理","移動","電","國","港","購");
$num = count($words);
for($i=0;$i< $num ;$i++){
if( preg_match("/$words[$i]/i", $comment_author) || preg_match("/$words[$i]/i", $comment_content) ){
err( __('廣告必刪,多謝理解!') );
break;
}
}

http://www.bkjia.com/PHPjc/633054.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/633054.htmlTechArticle在php中strpos是尋找字串首次出現的位置,如果存在就返回ture或相關具體數字,沒有就返回0或false了,但本人要用它做一個wordpress關鍵詞黑名...

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.