1,过滤敏感词
preg_match()函数用来在字符串中搜索所有与给定的正则表达式匹配的内容,如果存在则返回True,否则返回False。
语法:
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 "";
exit;
}
}
}
$filter_word = file("filterwords.txt");//把整个文件读入一个数组中
$str=$_POST['content'];
for($i=0;$i
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。文件的完整路径(c:/leaveMessage/filterwords.txt)或相对路径(相对应调用文件路径filterwords.txt),可写返回true,不可写返回false
示例:
代码如下:
(2)fopen()函数
fopen()函数用于打开某文件,并返回该文件的标示指针。该文件可以是本地的也可以是远程的。参数:
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()函数以只读方式打开文件
代码如下:
(3)fseek()函数
fseek()函数用于设置文件指针的位置参数:
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个字节的位置
?>
$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()函数用于将字符串写入指定的文件中,并可以规定写入字节的大小。参数说明:
handle:
必要参数。文件标识指针string:
必要参数。要写入某文件的字符串length:
可省参数。指写入文件的长度,如果省略该参数则将指定字符串的所有内容写入文件中例如:fwrite()函数将字符串“PHP留言本”写入filterwords.txt文件中
代码如下:
PHP
$fp=fopen("filterwords.txt","w+");
$str="PHP留言本";
if(fwrite($fp,$str)){
echo "文件写入成功!";
}else{
echo "文件写入失败";
}
?>
$fp=fopen("filterwords.txt","w+");
$str="PHP留言本";
if(fwrite($fp,$str)){
echo "文件写入成功!";
}else{
echo "文件写入失败";
}
?>
(5)fclose()函数
fclose()函数用于关闭指定的文件标识所指的文件。参数handle为fopen()函数或fsockopen()函数成功打开某文件后所返回的文件标识。
在留言本模块中,通过以上介绍的函数实向文本文件“filterwords.txt”中添加敏感词的功能。
代码如下:
PHP
if($_POST){
$filename="../filterwords.txt";
if(is_writable($filename)){
$file=fopen($filename,'r+'); //读写方式打开,将文件指针指向文件头。
}
else{
echo "文件".$filename."不可写";
}
//在文件尾写文件
fseek($file,SEEK_END); //设置指针位置,SEEK_END设置位置等于文件尾加上offset(这里为零)个字节
$word=$_POST[txt_word];
fwrite($file,$word);
fwrite($file,"\r\n");
fclose($file);
}
?>
if($_POST){
$filename="../filterwords.txt";
if(is_writable($filename)){
$file=fopen($filename,'r+'); //读写方式打开,将文件指针指向文件头。
}
else{
echo "文件".$filename."不可写";
}
//在文件尾写文件
fseek($file,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 "
敏感词如下:
".$a;
?>
$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
参数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.
?>
$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。 代码如下:
each()返回数组如下
Array
{
[1] => bob
[value] => bob
[0] => 0
[key] => 0
}
list()仅对数字索引起作用,而且默认键从零开始。所以list($name,$value)将键0和值bob分别赋值给$name和$value.
4,实现复选框的全选和反选
根据数据库中的内容应用for循环语句动态创建复选框的个数,被全选或反选的复选框必须设置name为note_id[],复选框的值是留言信息的ID号。Box" name="note_id[]" value="" />添加一个全选的复选框,作为要选择的内容。当勾选该复选框时,调用自定义函数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,$length,"utf-8");
if($start==0){
if(strlen(utf8_decode($str))>($length+$start)){
$str_new.=".";
}
}
return $str_new;
}
$str_new=iconv_substr($str,$length,"utf-8");
if($start==0){
if(strlen(utf8_decode($str))>($length+$start)){
$str_new.=".";
}
}
return $str_new;
}
2,htmlspecialchars()函数把一些预定义的字符转换为HTML实体。函数都是防止用户的非法操作的。
例如: 代码如下:
输出的是:
我添加的半个层
标记">编程之家