Home  >  Article  >  Backend Development  >  解析PHP留言本模块主要功能的函数说明(代码可实现)_PHP

解析PHP留言本模块主要功能的函数说明(代码可实现)_PHP

WBOY
WBOYOriginal
2016-06-01 12:05:38797browse
一,敏感词处理
1,过滤敏感词
preg_match()函数用来在字符串中搜索所有与给定的正则表达式匹配的内容,如果存在则返回True,否则返回False。

语法:
int preg_match(string pattern,string subject[,array matches[,int flags]])
preg_match()函数参数说明如下:
pattern:
必要参数,需要匹配的正则表达式
subject:必要参数,输入的字符串
matches:可选参数。输出搜索结果的数组,例如$out[0]将包含与整个模式匹配的结果,$out[1]将包含与第一个捕获的括号中的子模式所匹配的结果,一次类推
flags:可选参数。标记:PREG_OFFSET_CAPTURE,对每个出现的匹配结果页同时返回其附属的字符串偏移量,PHP4.3.0后可用。

具体实现方法如下:
首先,应用file()函数读取存储子文本文件中的敏感词汇(每个敏感词独立成一行),并将共存储在数组$file_word中。
然后,应用for循环语句自动读取数组元素(敏感词),直接通过正则表达式检验用户提交的留言信息是否含有敏感词。

当用户发表留言信息后,提交李艳信息时,将留言信息与存储在数组中的敏感词进行对比,如果留言信息中含有敏感词,那么将弹出提示信息,否则留言信息发布成功。实现敏感词过滤关键代码如下:
复制代码 代码如下:
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)){  //应用正则表达式,判断传递的留言信息中是否含有敏感词
    echo "<script> alert('留言信息中包含敏感词!');history.back(-1);</script>";
    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.bitsCN.com">';
 echo htmlspecialchars($str);

输出的是:
我添加的半个层
半个表格行标记
http://www.bitsCN.com">
3,str_replace()函数使用一个字符串替换字符串中的另一些字符.
语法:str_replace(find,replace,string,count)
参数说明:
find:
必须。规定要查找的值。
replace:必须。规定替换find内容的值
string:必须。规定被搜索的字符串
count:可选。一个变量,对替换数进行计数
Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn