解析PHP留言本模組主要功能的函數說明(代碼可實現)_PHP教程

來源:互聯網
上載者:User
一,敏感詞處理
1,過濾敏感詞
preg_match()函數用來在字串中搜尋所有與給定的Regex匹配的內容,如果存在則返回True,否則返回False。

文法:
int preg_match(string pattern,string subject[,array matches[,int flags]])
preg_match()函數參數說明如下:
pattern:
必要參數,需要匹配的Regex
subject:必要參數,輸入的字串
matches:選擇性參數。輸出搜尋結果的數組,例如$out[0]將包含與整個模式比對的結果,$out[1]將包含與第一個捕獲的括弧中的子模式所匹配的結果,一次類推
flags:選擇性參數。標記:PREG_OFFSET_CAPTURE,對每個出現的匹配結果頁同時返回其附屬的字串位移量,PHP4.3.0後可用。

具體實現方法如下:
首先,應用file()函數讀取儲存子文字檔中的禁用語(每個敏感詞獨立成一行),並將共儲存在數組$file_word中。
然後,應用for迴圈語句自動讀取數組元素(敏感詞),直接通過Regex檢驗使用者提交的留言資訊是否含有敏感詞。

當使用者發表留言資訊後,提交李豔資訊時,將留言資訊與儲存在數組中的敏感詞進行對比,如果留言資訊中含有敏感詞,那麼將彈出提示資訊,否則留言資訊發布成功。實現敏感詞過濾關鍵代碼如下:
複製代碼 代碼如下:
if (is_file("./filterwords.txt")){ //判斷給定檔案名稱是否為一個正常的檔案
$filter_word = file("filterwords.txt"); //把整個檔案讀入一個數組中
$str=$_POST['content'];
for($i=0;$i if(preg_match("/".trim($filter_word[$i])."/i",$str)){ //應用Regex,判斷傳遞的留言資訊中是否含有敏感詞
echo "";
exit;
}
}
}

file()函數
array file (string filename [, int use_include_path [, resource context]])
和readfile()一樣,只除了file()將檔案作為一個數組返回。數組中的每個單元都是檔案中相應的一行,包括分行符號在內。如果失敗file()返回FALSE。
2,添加敏感詞到文字檔
php向文字檔中寫入禁用語應用的主要函數
(1)is_writable()函數
is_writable()函數用於判斷某檔案是否存在,並且是否可寫,如果滿足上述條件則返回True,否則返回False。
文法:bool is_writable(string filename)參數filename用於指定檔案的完整路徑(c:/leaveMessage/filterwords.txt)或相對路徑(相對應調用檔案路徑filterwords.txt),可寫返回true,不可寫返回false
樣本:
複製代碼 代碼如下:
if(is_writable("filterwords.txt")){
echo "可寫檔案";
} else {
echo "不可寫檔案";
}

(2)fopen()函數
fopen()函數用於開啟某檔案,並返回該檔案的標示指標。該檔案可以是本地的也可以是遠端。
文法:resource fopen(string filename,string mode[,int use_include_path[,resource context]])
參數:
filename:
必要參數。用於指定要開啟檔案的本地或遠程地址
mode:必要參數。用於指定要開啟檔案的模式use_include_path:選擇性參數。如果將該參數設定為True,PHP會嘗試按照include_path標準包含路徑中的每個指向去開啟檔案
context:選擇性參數。設定提高檔案流效能的一些選項

mode檔案開啟模式參數說明:
'r' 唯讀方式開啟,將檔案指標指向檔案頭。
'r+' 讀寫方式開啟,將檔案指標指向檔案頭。
'w' 寫入方式開啟,將檔案指標指向檔案頭並將檔案大小截為零。如果檔案不存在則嘗試建立之。
'w+' 讀寫方式開啟,將檔案指標指向檔案頭並將檔案大小截為零。如果檔案不存在則嘗試建立之。
'a' 寫入方式開啟,將檔案指標指向檔案末尾。如果檔案不存在則嘗試建立之。
'a+' 讀寫方式開啟,將檔案指標指向檔案末尾。如果檔案不存在則嘗試建立之。 'x'建立並以寫入方式開啟,將檔案指標指向檔案頭。如果檔案已存在,則fopen()調用失敗並返回FALSE,並產生一條E_WARNING層級的錯誤資訊。如果檔案不存在則嘗試建立之。這和給底層的open(2)系統調用指定O_EXCL|O_CREAT標記是等價的。此選項被PHP4.3.2 以及以後的版本所支援,僅能用於本地檔案。'x+'建立並以讀寫方式開啟,將檔案指標指向檔案頭。如果檔案已存在,則fopen()調用失敗並返回FALSE,並產生一條E_WARNING層級的錯誤資訊。如果檔案不存在則嘗試建立之。這和給 底層的 open(2) 系統調用指定 O_EXCL|O_CREAT 標記是等價的。此選項被 PHP 4.3.2 以及以後的版本所支援,僅能用於本地檔案。

樣本:fopen()函數以唯讀方式開啟檔案
複製代碼 代碼如下:
$fp=fopen("filterwords.txt","r");
?>

(3)fseek()函數
fseek()函數用於設定檔案指標的位置
文法:int fseek(resource handle,int offset[,int whence])
參數:
handle:
必要參數。開啟某檔案後返回的檔案標識
offset:必要參數。用於設定檔案指標的位置
whence:可省參數。
fessk()函數的whence參數說明
seek_set:設定位置等於offset個位元組。該值為該參數的預設值
seek_cur:設定位置等於當前位置加上offset個位元組
seek_end:設定位置等於檔案尾加上offset個位元組
例如,應用fopen()函數開啟檔案“test.txt”,然後讀取該檔案4096個位元組的內容,最後應用fseek()函數將檔案指標恢複到原位置。
複製代碼 代碼如下:
$fp=fopen("filterwords.txt","r"); //以唯讀方式開啟某檔案
$data=fgets($fp,4096); //讀取檔案中一行4096個位元組的內容
fseek($fp,0); //使檔案指標指向第0個位元組的位置
?>

string fgets(int handle[,int length])
從handle指向的檔案中讀取一行並返回長度最多為length - 1位元組的字串。碰到分行符號(包括在傳回值中)、EOF或者已經讀取了length- 1位元組後停止(看先碰到那一種情況)。如果沒有指定length,則預設為1K,或者說1024位元組。(考慮到程式執行效率,一般還是選用某一固定長度值)
(4)fwrite()函數
fwrite()函數用於將字串寫入指定的檔案中,並可以規定寫入位元組的大小。
文法:int fwrite(resource handle,string string[,int length])
參數說明:
handle:
必要參數。檔案標識指標
string:必要參數。要寫入某檔案的字串
length:可省參數。指寫入檔案的長度,如果省略該參數則將指定字串的所有內容寫入檔案中
例如:fwrite()函數將字串“PHP留言本”寫入filterwords.txt檔案中
複製代碼 代碼如下:
$fp=fopen("filterwords.txt","w+");
$str="PHP留言本";
if(fwrite($fp,$str)){
echo "檔案寫入成功!";
}else{
echo "檔案寫入失敗";
}
?>

(5)fclose()函數
fclose()函數用於關閉指定的檔案標識所指的檔案。
文法:bool fclose(resource handle)
參數handle為fopen()函數或fsockopen()函數成功開啟某檔案後所返回的檔案標識。
在留言本模組中,通過以上介紹的函數實向文字檔“filterwords.txt”中添加敏感詞的功能。
複製代碼 代碼如下:
if($_POST){
$filename="../filterwords.txt";
if(is_writable($filename)){
$file=fopen($filename,'r+'); //讀寫方式開啟,將檔案指標指向檔案頭。
}
else{
echo "檔案".$filename."不可寫";
}
//在檔案尾寫檔案
fseek($file,0,SEEK_END); //設定指標位置,SEEK_END設定位置等於檔案尾加上offset(這裡為零)個位元組
$word=$_POST[txt_word];
fwrite($file,$word);
fwrite($file,"\r\n");
fclose($file);
}
?>

3,讀取檔案中的敏感詞
複製代碼 代碼如下:
$filename="../filterwords.txt";
if(is_readable($filename)){
$arr=file($filename);
}
else{
echo "檔案".$filename."不可讀";
}
while(list($name,$value)=each($arr)){ //遍曆數組
$a.="$value".",";
}
echo "
敏感詞如下:
".$a;
?>

(1)is_readable()判斷檔案是否存在,並且是否可讀,如果滿足上述條件則返回True
文法:bool is_readable(string filename),參數filename用於指定檔案的完整路徑
(2)void list(mixed...)
像array()一樣,這不算真正的函數,而是語言結構。list()用一步操作給一組變數進行賦值。list()僅能用於數字索引的數組並假定數字索引從0開始.
例如:
複製代碼 代碼如下:
$info = array('coffee', 'brown', 'caffeine');
list($drink, $color, $power) = $info;
print "$drink is $color and $power makes it special.\n";
//coffee is brown and caffeine makes it special.
list($drink, $color) = $info;
print "$drink is $color.\n";
//coffee is brown.
?>

(3)array each(array array)
返回array數組中當前指標位置的鍵和值,並向前移動數組指標。索引值對被返回為四個單元的數組,鍵名為0,1,key和value.單元0和key包含數組單元的鍵名,1和value包含有資料。如果內部指標越過了數組的末端,則each()返回FALSE。
複製代碼 代碼如下:
$foo = array ("bob", "fred", "jussi", "jouni", "egon", "marliese");
$bar = each($foo);
print_r($bar);
?>

each()返回數組如下
Array
{
[1] => bob
[value] => bob
[0] => 0
[key] => 0
}
list()僅對數字索引起作用,而且預設鍵從零開始。所以list($name,$value)將鍵0和值bob分別賦值給$name和$value.
4,實現複選框的全選和反選
根據資料庫中的內容應用for迴圈語句動態建立複選框的個數,被全選或反選的複選框必須設定name為note_id[],複選框的值是留言資訊的ID號。


添加一個全選的複選框,作為要選擇的內容。當勾選該複選框時,調用自訂函數check_all()函數來設定複選框的全選。


全選
全選的實現,遍曆所有的複選框form.elements[i],然後設定各多選項的checked屬性為True。
反選的實現,遍曆所有複選框form.elements[i],擷取複選框的checked屬性值,如果是True,則設定為False,否則設為True,即作為當前值的相反設定。
複製代碼 代碼如下:


二,留言本程式碼分析
1,substr()截取中文字串問題
函數:string substr(string string, int start, int [length]);
參數說明:
string:
必須,表示要處理的字串
start:必須,表示從string字串的第start位開始取,若start為負數,則從字串尾端算起
length:可選,表示要取的字串長度,若length為負數,則表示取到倒數第length個字元
中文字元佔兩個長度,英文字元和符號佔一個長度。php內建函數substr(string str,intstart,[int length])是用來截取指定字串長度的。在截取英文字串時沒問題,但是在截取中文或者是中英文混合的字串中,就會出現最後一個字元變成問號的問題。
下面則是自訂的中文字串截取函數:
複製代碼 代碼如下:
function str_cut($str,$start,$length){ //中文字串截取函數
$str_new=iconv_substr($str,$start,$length,"utf-8");
if($start==0){
if(strlen(utf8_decode($str))>($length+$start)){
$str_new.=".";
}
}
return $str_new;
}

2,htmlspecialchars()函數把一些預定義的字元轉換為HTML實體。函數都是防止使用者的非法操作的。
例如:
複製代碼 代碼如下:
$str='我添加的半個層半個表格行標記
http://www.jb51.net">指令碼之家';
echo htmlspecialchars($str);

輸出的是:
我添加的半個層半個表格行標記
http://www.jb51.net">指令碼之家
3,str_replace()函數使用一個字串替換字串中的另一些字元.
文法:str_replace(find,replace,string,count)
參數說明:
find:
必須。規定要尋找的值。
replace:必須。規定替換find內容的值
string:必須。規定被搜尋的字串
count:可選。一個變數,對替換數進行計數

http://www.bkjia.com/PHPjc/327862.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/327862.htmlTechArticle一,敏感詞處理 1,過濾敏感詞 preg_match()函數用來在字串中搜尋所有與給定的Regex匹配的內容,如果存在則返回True,否則返回Fa...

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.