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

一,敏感词处理
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<count($filter_word);$i++){ //应用For循环语句对敏感词进行判断
    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()函数以只读方式打开文件


代码如下:

<?php
 $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()函数将文件指针恢复到原位置。


代码如下:

<?php
 $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文件中


代码如下:

<?php
 $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”中添加敏感词的功能。


代码如下:

<?php
 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,读取文件中的敏感词


代码如下:

<?php
 $filename="../filterwords.txt";
 if(is_readable($filename)){
  $arr=file($filename);
 }
 else{
  echo "文件".$filename."不可读";
 }
 while(list($name,$value)=each($arr)){   //遍历数组
  $a.="$value".",";
 }
 echo "<br>敏感词如下:<br>".$a;
?>

(1)is_readable()判断文件是否存在,并且是否可读,如果满足上述条件则返回True
语法:bool is_readable(string filename),参数filename用于指定文件的完整路径
(2)void list(mixed...)
像array()一样,这不算真正的函数,而是语言结构。list()用一步操作给一组变量进行赋值。list()仅能用于数字索引的数组并假定数字索引从0开始.
例如:


代码如下:

<?php
 $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。


代码如下:

<?php
 $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号。

<input type="checkbox" name="note_id[]" value="<?php echo $id;?>" />
添加一个全选的复选框,作为要选择的内容。当勾选该复选框时,调用自定义函数check_all()函数来设置复选框的全选。

<input type="checkbox" name="select_all" onClick="check_all(this.form)" />
<span class="style1">全选</span>
全选的实现,遍历所有的复选框form.elements[i],然后设置各多选项的checked属性为True。
反选的实现,遍历所有复选框form.elements[i],获取复选框的checked属性值,如果是True,则设置为False,否则设为True,即作为当前值的相反设置。


代码如下:

<script language="JavaScript">
//反选表单中checkbox
function inverse(form){
 for (var i=0;i<form.elements.length-2;i++){
 //form.elements.length获取页面表单input元素的个数,例如checkbox,radio,text,button,submit等 
  var e = form.elements[i];
  e.checked == true ? e.checked = false : e.checked = true;
 }
}
//选择表单中所有check_box
function check_all(form){
 for(var i=0;i<form.elements.length-2;i++){
  var e=form.elements[i];
  e.checked=true;
 }
}
</script>

二,留言本代码分析
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='<div>我添加的半个层</div></td>半个表格行标记<br/><a href="<a href="http://www.jb51.net/">http://www.jb51.net</a>">我们</a>';
 echo htmlspecialchars($str);

输出的是:
<div>我添加的半个层</div></td>半个表格行标记<br/><a href="<a href="http://www.jb51.net/">http://www.jb51.net</a>">我们</a>
3,str_replace()函数使用一个字符串替换字符串中的另一些字符.
语法:str_replace(find,replace,string,count)
参数说明:
find:
必须。规定要查找的值。
replace:必须。规定替换find内容的值
string:必须。规定被搜索的字符串
count:可选。一个变量,对替换数进行计数

(0)

相关推荐

  • php中get_magic_quotes_gpc()函数说明

    get_magic_quotes_gpc函数是一个用来判断是否为用户提供的数据增加斜线了,这个在php.ini配置文件中哦,下面我来介绍一下get_magic_quotes_gpc()函数说明. get_magic_quotes_gpc函数介绍 取得 PHP 环境变数 magic_quotes_gpc 的值,属于 PHP 系统功能. 语法: long get_magic_quotes_gpc(void); 返回值: 长整数 本函数取得 PHP 环境配置的变量 magic_quotes_gpc (

  • PHP函数篇详解十进制、二进制、八进制和十六进制转换函数说明

    一,十进制(decimal system)转换函数说明 1,十进制转二进制 decbin() 函数,如下实例 echo decbin(12); //输出 1100 echo decbin(26); //输出 11010 decbin (PHP 3, PHP 4, PHP 5) decbin -- 十进制转换为二进制 说明 string decbin ( int number ) 返回一字符串,包含有给定 number 参数的二进制表示.所能转换的最大数值为十进制的 4294967295,其结果为

  • php 数组操作(增加,删除,查询,排序)等函数说明第1/2页

    数据增加,删除,查询,排序详细说明 对数组的添加(首尾数据添加(不限定条数)以及中间任意位置添加数据操作) . 2-对数组的删除(首尾的数据删除(不限定条数)以及中间任意位置的数据删除操作,条件:对数组中间位置删除的,后面的值往前挪,接上以前的位置) . 3-对数据的排序操作(排序操作,要的是效率) . 4-对数组的查询(对数组中的某一数据进行查询,如果满足,则生成新的数组,这个新的数组就是满足查询条件的,条件:查询,并不是查询某一个值,还有查询某一个值满足某个条件,举个例子:查询数组中某个值大

  • php magic_quotes_gpc的一点认识与分析

    blankyao 说"学习的过程就是不断的发现错误,不断的改正错误": 先看下手册上怎么说的吧! 对一般人来说看下前两段就可以了 Magic Quotes 代码: Magic Quotes is a process that automagically escapes incoming data to the PHP script. It's preferred to code with magic quotes off and to instead escape the data a

  • PHP 字符串正则替换函数preg_replace使用说明

    1. preg_replace() $msg = preg_replace("/<style>.+<\/style>/is", "", $msg); -----删除<style></style>和中间的部分 $msg = preg_replace("/<[^>]+>/", "", $msg); -----是删除<>和中间的内容 i (PCRE_CAS

  • 基于PHP magic_quotes_gpc的使用方法详解

    PHP magic_quotes_gpc主要是作用在WEB客户服务端的,它的作用时间是从请求开始,接下来我们将具体的为大家讲解它的使用方式.AD:我们今天要向大家介绍的是PHP magic_quotes_gpc的具体使用方法.大家都知道在PHP中一个特殊的函数魔术函数,它在引用的过程中只有在传递$_GET,$_POST,$_COOKIE时才会发生作用.•PHP函数preg_split的正确使用方法•解读PHP函数explode()的具体使用方法•PHP函数implode()与explode()函

  • php中magic_quotes_gpc对unserialize的影响分析

    本文实例分析了php中magic_quotes_gpc对unserialize的影响.分享给大家供大家参考.具体如下: magic_quotes_gpc是一个php中一个给单双引号增加一些安全过滤的函数,但此函数对于我们使用unserialize函数时会产生一些影响,下面我们就这个问题与大家看几个实例与解决办法. 昨天朋友让我帮他解决下他网站的购物车程序的问题,程序用的是PHPCMS,换空间前是好的,刚换的空间,具体问题是提示成功加入购物车后跳转到购物车页面,购物车里为空. 我看了下代码,大致的

  • PHP中simplexml_load_string函数使用说明

    先用一段代码重现一下问题 乍一看,结果很让人费解: 复制代码 代码如下: <?php $string = <<<EOF <data> <foo><bar>hello</bar></foo> <foo><bar>world</bar></foo> </data> EOF; $data = simplexml_load_string($string); print_r

  • PHP访问MYSQL数据库封装类(附函数说明)

    复制代码 代码如下: <?php /* MYSQL 数据库访问封装类 MYSQL 数据访问方式,php4支持以mysql_开头的过程访问方式,php5开始支持以mysqli_开头的过程和mysqli面向对象 访问方式,本封装类以mysql_封装 数据访问的一般流程: 1,连接数据库 mysql_connect or mysql_pconnect 2,选择数据库 mysql_select_db 3,执行SQL查询 mysql_query 4,处理返回的数据 mysql_fetch_array my

  • php array_map()数组函数使用说明

    复制代码 代码如下: /*函数array_map()函数:多数组回调函数---将回调函数作用到给定数组的单元上 * 1.语法:array array_map ( callback callback, array arr1 [, array ...] ) * 2.描述:返回一个数组,该数组包含了 arr1 中的所有单元经过 callback 作用过之后的 * 单元.callback 接受的参数数目应该和传递给 array_map() 函数的数组数目一致. * 3.注意事项: * 3.1.多数组回调

  • PHP5下$_SERVER变量不再受magic_quotes_gpc保护的弥补方法

    复制代码 代码如下: <?php $magic_quotes_gpc = get_magic_quotes_gpc(); @extract(daddslashes($_COOKIE)); @extract(daddslashes($_POST)); @extract(daddslashes($_GET)); if(!$magic_quotes_gpc) { $_FILES = daddslashes($_FILES); } daddslashes函数 复制代码 代码如下: //转译字符函数 fu

随机推荐