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


Posted in PHP onJune 25, 2013

一,敏感词处理
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="https://3water.com/">https://3water.com</a>">三水点靠木</a>';
 echo htmlspecialchars($str);

输出的是:
<div>我添加的半个层</div></td>半个表格行标记<br/><a href="<a href="https://3water.com/">https://3water.com</a>">三水点靠木</a>
3,str_replace()函数使用一个字符串替换字符串中的另一些字符.
语法:str_replace(find,replace,string,count)
参数说明:
find:
必须。规定要查找的值。
replace:必须。规定替换find内容的值
string:必须。规定被搜索的字符串
count:可选。一个变量,对替换数进行计数
PHP 相关文章推荐
建立动态的WML站点(二)
Oct 09 PHP
php DOS攻击实现代码(附如何防范)
May 29 PHP
PHP中header和session_start前不能有输出原因分析
Jan 11 PHP
php中并发读写文件冲突的解决方案
Oct 25 PHP
使用PHP破解防盗链图片的一个简单方法
Jun 07 PHP
PHP图片处理之使用imagecopyresampled函数裁剪图片例子
Nov 19 PHP
Symfony2中被遗弃的getRequest()方法分析
Mar 17 PHP
PHP中list方法用法示例
Dec 01 PHP
详解thinkphp实现excel数据的导入导出(附完整案例)
Dec 29 PHP
Laravel 的数据库迁移的方法
Jul 31 PHP
PHP设计模式之适配器模式原理与用法分析
Apr 25 PHP
PHPstorm启用自动换行的方法详解(IDE)
Sep 17 PHP
深入PHP购物车模块功能分析(函数讲解,附源码)
Jun 25 #PHP
基于PHP+Ajax实现表单验证的详解
Jun 25 #PHP
PHP Class&amp;Object -- 解析PHP实现二叉树
Jun 25 #PHP
PHP Class&amp;Object -- PHP 自排序二叉树的深入解析
Jun 25 #PHP
通过PHP current函数获取未知字符键名数组第一个元素的值
Jun 24 #PHP
PHP多例模式介绍
Jun 24 #PHP
PHP获取和操作配置文件php.ini的几个函数介绍
Jun 24 #PHP
You might like
php Sql Server连接失败问题及解决办法
2009/08/07 PHP
让codeigniter与swfupload整合的最佳解决方案
2014/06/12 PHP
解决更换PHP5.4以上版本后Dedecms后台登录空白问题的方法
2015/10/23 PHP
Zend Framework教程之Zend_Controller_Plugin插件用法详解
2016/03/07 PHP
PHP将MySQL的查询结果转换为数组并用where拼接的示例
2016/05/13 PHP
基于jquery的让textarea自适应高度的插件
2010/08/03 Javascript
javaScript实现浮点数转十六进制字符
2013/10/29 Javascript
js如何判断用户是在PC端和还是移动端访问
2014/04/24 Javascript
jQuery使用$.ajax进行异步刷新的方法(附demo下载)
2015/12/04 Javascript
详解Javascript ES6中的箭头函数(Arrow Functions)
2016/08/24 Javascript
JS 调用微信扫一扫功能
2016/12/22 Javascript
简单谈谈关于 npm 5.0 的新坑
2017/06/08 Javascript
ionic中的$ionicPlatform.ready事件中的通用设置
2017/06/11 Javascript
js es6系列教程 - 新的类语法实战选项卡(详解)
2017/09/02 Javascript
apicloud拉起小程序并传递参数的方法示例
2018/11/21 Javascript
详解wepy开发小程序踩过的坑(小结)
2019/05/22 Javascript
基于JS+HTML实现弹窗提示是否确认提交功能
2020/06/17 Javascript
vue中element 的upload组件发送请求给后端操作
2020/09/07 Javascript
简单文件操作python 修改文件指定行的方法
2013/05/15 Python
python中assert用法实例分析
2015/04/30 Python
python利用MethodType绑定方法到类示例代码
2017/08/27 Python
Django重装mysql后启动报错:No module named ‘MySQLdb’的解决方法
2018/04/22 Python
基于python历史天气采集的分析
2019/02/14 Python
Python实现的栈、队列、文件目录遍历操作示例
2019/05/06 Python
通过实例学习Python Excel操作
2020/01/06 Python
Python如何实现邮件功能
2020/05/27 Python
pycharm + django跨域无提示的解决方法
2020/12/06 Python
办公室前台岗位职责
2014/01/04 职场文书
中年人生感言
2014/02/04 职场文书
运动会解说词200字
2014/02/06 职场文书
中学生运动会入场词
2014/02/12 职场文书
2014大学生批评与自我批评思想汇报
2014/09/21 职场文书
“四风”问题自我剖析材料思想汇报
2014/09/23 职场文书
党员年终个人总结
2015/02/14 职场文书
python实现对doc、txt、xls等文档的读写操作
2022/04/02 Python
centos7安装mysql5.7经验记录
2022/05/02 Servers