正则表达式(Regular Expression)
正则表达式系统:
1.POSIX
2.Perl
PHP中使用的regex是PCRE:
NOTE:PCRE(Perl兼容正则表达式,Perl Compatible Regular Expressions)
PCRE语法:
1.定界符
必须成对出现,可以使用除0-9a-zA-Z以外的任何字符
2.原子
1.正则需要匹配的可见和不可见字符都是原子
2.一个正则表达式最少含有一个原子
3.当需要匹配诸如"("、"["、"^"等含有语义的符号时需要用""反斜线进行转义
原子字符:
f 匹配换页符
n 匹配换行符
r 匹配回车符
t 匹配制表符
v 匹配垂直制表符
3.元字符
转义字符
^ 匹配字符串起始处
$ 匹配字符串末尾
. 匹配除"n"之外的任何单个字符
* 匹配前面的子表达式0或多次
+ 匹配前面的子表达式1次或多次
? 匹配前面的子表达式0次或1次
{n} 匹配n次
{n,} 匹配n次或n次以上
{n,m} 最少匹配n次至多匹配m次,(n<=m)
[] 中括号代表原子表,中间的原子地位都是相等。在匹配的时候,匹配表中的任意一个字符
[^] 抑扬符,排除后面的原子表所包含的字符。
(pattern) 匹配pattern并获取这一匹配。
num 对获取的第num个匹配的引用。
(?:pattern) 匹配pattern但不获取这一匹配
(?=pattern) 正向肯定预查,非获取匹配,例如:windows(?=XP|7)能匹配windowsXP中的windows不能匹配windows98中的windows
(?!=pattern) 正向否定欲查非获取匹配,例如:windows(?!98|2000),能匹配windowsXP中的windows,不能匹配windows98中的windows
(?<=pattern) 反向肯定预查,非获取匹配。例如:(?<=My|Postgre)SQL能匹配MySQL中的SQL,不能匹配MSSQL中的SQL
(?<!pattern) 反向否定预查,非获取匹配。例如:(?<!My|Postgre)SQL能匹配MSSQL中的SQL,不能匹配MySQL中的SQL
b 匹配单词边界
B 匹配除单词边界以外的字符
d 匹配任何一个数字。等价于[0-9]
D 匹配任何一个非数字以外的字符。等价于[^0-9]
s 匹配任何一个空白字符(包括空格、制表符、换页符等)。等价于[fnrtv]
S 匹配任何一个非空白字符。等价于[^fnrtv]
w 匹配任何一个数字、字母或下划线。等价于[0-9a-zA-Z]
W 匹配任何一个非数字、字母或下划线的字符。等价于[^0-9a-zA-Z]
4.模式修正符
i 不区分大小写
m 此模式中如果有回车或换行,^和$将匹配每行的行首和行尾
s 让.能匹配n
x 忽略空白
U 取消贪婪,相当于(.*?)
A 与^效果一样
D 结尾处不忽略回车 ,在结束处有$符的时候,在匹配的字符串后面加上回车,$依然能够匹配它成功。但是加上D之后,结尾的回车,不再匹配
NOTE:正则表达式是从左向右进行匹配的
常用的正则表达式
1、非负整数:”^d+$”
2、正整数:”^[0-9]*[1-9][0-9]*$”
3、非正整数:”^((-d+)|(0+))$”
4、负整数:”^-[0-9]*[1-9][0-9]*$”
5、整数:”^-?d+$”
6、非负浮点数:”^d+(.d+)?$”
7、正浮点数:”^((0-9)+.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*.[0-9]+)|([0-9]*[1-9][0-9]*))$”
8、非正浮点数:”^((-d+.d+)?)|(0+(.0+)?))$”
9、负浮点数:”^(-((正浮点数正则式)))$”
10、英文字符串:”^[A-Za-z]+$”
11、英文大写串:”^[A-Z]+$”
12、英文小写串:”^[a-z]+$”
13、英文字符数字串:”^[A-Za-z0-9]+$”
14、英数字加下划线串:”^w+$”
15、E-mail地址:”^[w-]+(.[w-]+)*@[w-]+(.[w-]+)+$”
16、URL:”^[a-zA-Z]+://(w+(-w+)*)(.(w+(-w+)*))*(?s*)?$”
下面这个用PHP写的函数,可以获取任意的字符串$string中的所有链接地址($string可以是从一个HTML页面文件直接读取出来的字符串),结果保存在一个数组中返回.该函数自动把电子邮件地址排除在外,而且返回的数组中不会有重复元素.
代码如下 | 复制代码 |
function GetAllLink($string) $regex[url] = "((http|https|ftp|telnet|news)://)?([a-z0-9_-/.]+.[][a-z0-9:;&#@=_~%?/.,+-]+)"; //去掉标签之间的文字 //去掉JAVASCRIPT代码 |
//去掉非<a>的HTML标签
代码如下 | 复制代码 |
$string = eregi_replace("<[^a][^<>]*>","", $string); //去掉EMAIL链接 //替换需要的网页链接 $output[0] = strtok($string, "t"); return $output; |
以下是以PHP的语法所写的示例
验证字符串是否只含数字与英文,字符串长度并在4~16个字符之间
代码如下 | 复制代码 |
<?php |
简易的台湾身分证字号验证
代码如下 | 复制代码 |
<?php |
下面的代码实现文字中的代码块,功能就如你在脚本之家看到的代码一样。
代码如下 | 复制代码 |
function codedisp($code) { |
首先是一个文件看能不能读取(权限问题),或者存在不,我们可以用is_readable函数获取信息.:
php/func_filesystem_is_readable.htm">is_readable函数用法
代码如下 | 复制代码 |
<?php |
输出:
test.txt is readable
利用file_get_contents函数来读取文件,这个函数可以读取大数据量的文件,也可以读取远程服务器文件,但必须在php.ini开始allow_url_fopen = On否则此函数不可用。
代码如下 | 复制代码 |
<?php $file = "filelist.php"; if (file_exists($file) == false) { die('文件不存在'); } $data = file_get_contents($file); echo htmlentities($data); ?> |
读取远程 文件,这是本教程这外的话题了。
代码如下 | 复制代码 |
function vita_get_url_content($url) { |
利用fread函数
来读取文件,这个函数可以读取指定大小的数据量
//fread读取文件实例一
代码如下 | 复制代码 |
$filename = "/www.111cn.net/local/something.txt"; |
//php5以上版本读取远程服务器内容
代码如下 | 复制代码 |
$handle = fopen("http://www.111cn.net/", "rb"); |
还有一种方式,可以读取二进制的文件:
代码如下 | 复制代码 |
$data = implode('', file($file)); |
fwrite 文件的写操作
fwrite() 把 string 的内容写入文件指针 file 处。 如果指定了 length,当写入了 length 个字节或者写完了 string 以后,写入就会停止,视乎先碰到哪种情况。
fwrite() 返回写入的字符数,出现错误时则返回 false。
文件写入函式:
代码如下 | 复制代码 |
<?php //文件写入函式 function PHP_Write($file_name,$data,$method="w") { $filenum=@fopen($file_name,$method); flock($filenum,LOCK_EX); $file_data=fwrite($filenum,$data); fclose($filenum); return $file_data; } ?> |
HTTP-REFERER这个变量已经越来越不可靠了,完全就是可以伪造出来的东东。
1.php 请求 2.php 。
1.php代码:
代码如下 | 复制代码 |
$ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "http://localhost/2.php"); curl_setopt($ch, CURLOPT_HTTPHEADER, array('X-FORWARDED-FOR:8.8.8.8', 'CLIENT-IP:8.8.8.8')); //构造IP curl_setopt($ch, CURLOPT_REFERER, "http://www.google.com/ "); //构造来路 curl_setopt($ch, CURLOPT_HEADER, 1); $out = curl_exec($ch); curl_close($ch); |
2.php代码如下:
代码如下 | 复制代码 |
function getClientIp() { if (!empty($_SERVER["HTTP_CLIENT_IP"])) $ip = $_SERVER["HTTP_CLIENT_IP"]; else if (!empty($_SERVER["HTTP_X_FORWARDED_FOR"])) $ip = $_SERVER["HTTP_X_FORWARDED_FOR"]; else if (!empty($_SERVER["REMOTE_ADDR"])) $ip = $_SERVER["REMOTE_ADDR"]; else $ip = "err"; return $ip; } echo "IP: " . getClientIp() . ""; echo "referer: " . $_SERVER["HTTP_REFERER"]; |
伪造成功,这是不是给“刷票”的朋友提供了很好的换IP的方案!!
再看一下相对复杂的处理办法
以下是伪造方法:
代码如下 | 复制代码 |
PHP(前提是装了curl): PHP代码 $ch = curl_init(); curl_setopt ($ch, CURLOPT_URL, "http://www.111cn.net"); curl_setopt ($ch, CURLOPT_REFERER, "http://www.111cn.net/"); curl_exec ($ch); curl_close ($ch); PHP(不装curl用sock) |
PHP代码
代码如下 | 复制代码 |
$server = '127.0.0.1'; $host = '127.0.0.1'; $target = '/xxx.asp'; $referer = 'http://127.0.0.1/'; // Referer $port = 80; $fp = fsockopen($server, $port, $errno, $errstr, 30); if (!$fp) { echo "$errstr ($errno)<br />n"; } else { $out = "GET $target HTTP/1.1rn"; $out .= "Host: $hostrn"; $out .= "Cookie: ASPSESSIONIDSQTBQSDA=DFCAPKLBBFICDAFMHNKIGKEGrn"; $out .= "Referer: $refererrn"; $out .= "Connection: Closernrn"; fwrite($fp, $out); while (!feof($fp)) { echo fgets($fp, 128); } fclose($fp); } |
IP也可以伪造
代码如下 | 复制代码 |
$fp = fsockopen ("192.168.0.128", 80, $errno, $errstr, 30); $msg.="Client-IP: 1.1.1.1rn"; |
记住用fsockopen时,命令最后一定要有rnrn,不然会超时。
其实这个可以用$_SERVER['REMOTE_ADDR']来得到正确IP,但是人们为了得到代理访问IP,而采用的得到IP的方法往往不是$_SERVER['REMOTE_ADDR'],这就为我们提供了机会。
这里另外一篇关于 curl 伪造 ip地址的文章有兴趣的同学可以参考一下
http://www.111cn.net/phper/php-cy/39779.htm
本文章来介绍了在php中如何把数组转换成对象或是把对象转换成数组对象,有需要的同学和朋友们可以参考一下本文章的这个实例啊。用stdClass转换数组为对象
Php代码
代码如下 | 复制代码 |
$arr = array(); $arr = array(); |
用stdClass转换后:
Php代码
代码如下 | 复制代码 |
$object = new StdClass; $object = new StdClass; |
stdClass是PHP的一个基类,所有的类几乎都继承这个类,所以任何时候都可以被new,可以让这个变量成为一个object。同时,这个基类又有一个特殊的地方,就是没有方法
我应用的地方是simplexml中的simplexml_load_string()上,因为返回的全是对象,如果提取数据比较麻烦,所以应用了下面的函数
代码如下 | 复制代码 |
|
数组转换成对象
代码如下 | 复制代码 |
<?php $arrayobject = new ArrayObject($array); var_dump($arrayobject); |
运行结果:
代码如下 | 复制代码 |
object(ArrayObject)#1 (1) { ["storage":"ArrayObject":private]=> array(3) { [1]=> string(3) "php" [2]=> string(4) "java" [3]=> string(3) "c " }} |
一个类:ArrayObject,可以直接将数组转化为对象
Php代码
代码如下 | 复制代码 |
$array = array('1' => 'one', '2' => 'two', '3' => 'three'); $arrayobject = new ArrayObject($array); var_dump($arrayobject); $array = array('1' => 'one', '2' => 'two', '3' => 'three'); $arrayobject = new ArrayObject($array); var_dump($arrayobject); |
结果:
代码如下 | 复制代码 |
Php代码 object(ArrayObject)#1 (3) { [1]=> string(3) "one" [2]=> string(3) "two" [3]=> string(5) "three" } |
PHP文件读取函式
//文件读取函式
代码如下 | 复制代码 |
function PHP_Read($file_name) { $fd=fopen($file_name,r); while($bufline=fgets($fd, 4096)){ $buf.=$bufline; } fclose($fd); return $buf; } ?> |
文件写入函式
//文件写入函式
代码如下 | 复制代码 |
function PHP_Write($file_name,$data,$method=”w”) { $filenum=@fopen($file_name,$method); flock($filenum,LOCK_EX); $file_data=fwrite($filenum,$data); fclose($filenum); return $file_data; } ?> |
静态页面生成函式
//静态页面生成函式
代码如下 | 复制代码 |
function phptohtm($filefrom,$fileto,$u2u=1){ if($u2u==1){ $data=PHP_Read($filefrom); }else{ $data=$filefrom; } PHP_Write($fileto,$data); return true; } ?> |
指定条件信息数量检索函式
//指定条件信息数量检索函式
代码如下 | 复制代码 |
function rec_exist($table,$where){ $query=”select count(*) as num from $table “.$where; $result=mysql_query($query) or die(nerror(1)); $rowcount=mysql_fetch_array($result); $num=$rowcount["num"]; if ($num==0){ return false; } return $num; } ?> |
目录删除函式
//目录删除函式
代码如下 | 复制代码 |
function del_DIR($directory){ $mydir=dir($directory); while($file=$mydir->read()){ if((is_dir(“$directory/$file”)) AND ($file!=”.”) AND ($file!=”..”)){ del_DIR(“$directory/$file”); }else{ if(($file!=”.”) AND ($file!=”..”)){ unlink(“$directory/$file”); //echo “unlink $directory/$file ok “; } } } $mydir->close(); rmdir($directory); //echo “rmdir $directory ok “; } ?> |
目录名称合法性检测函式
//目录名称合法性检测
代码如下 | 复制代码 |
function isen($str){ $ret=”"; for($i=0;$i $p=ord(substr($str,$i,1)); if(($p<48 & $p!=45 & $p!=46) || ($p>57 & $p<65) || ($p>90 & $p<97 & $p!=95) || $p>122){ nerror(“不符合规范!”); } $ret.=chr($p); } return $ret; } ?> |
PHP分页函数
代码如下 | 复制代码 |
//分页函数 function splitlist($HALT,$LRLIST,$ECHOCNT,$paper,$table,$where,$page_id,$userid){ global $splitstr,$sumcnt; if($paper==”" || $sumcnt==”"){ $query = “select count(*) as num from $table $where”; $result = mysql_query($query); $row = mysql_fetch_array($result); $sumcnt=$row["num"]; if($sumcnt==0){ nerror(“该版内还没有选择发布新闻 !”); } $paper=1; } $sumpaper=($sumcnt-$sumcnt%$ECHOCNT)/$ECHOCNT; if(($sumcnt%$ECHOCNT)!=0) $sumpaper+=1; if($sumpaper==1 && $HALT==0) return($where); $enwhere=base64_encode(base64_encode($where)); if(($LRLIST*2+1) < $sumpaper){ if(($paper-$LRLIST) < 2){ $tract=1; $sub=$LRLIST*2+1; }else if(($paper+$LRLIST) >= $sumpaper){ $tract=$sumpaper-($LRLIST*2); $sub=$sumpaper; }else{ $tract=$paper-$LRLIST; $sub=$paper+$LRLIST; } }else{ $tract=1; $sub=$sumpaper; } $uppaper=$paper-1; $downpaper=$paper+1; $startcnt=($paper-1)*$ECHOCNT; $where.=” limit ${ startcnt },${ ECHOCNT }”; if($tract > 1) { $splitstr=”【 << “; } else $splitstr=”【 << “; for($i=$tract;$i<=$sub;$i++){ if ($i!=$paper) $splitstr.=”".$i.” “; else $splitstr.=”".$i.” “; } if ($sub!=$sumpaper) $splitstr.=”>> 】”; else $splitstr.=”>> 】”; return($where); } ?> |
PHP关于分页函式的使用说明
PHP图片文件上传函式
//图片文件上传函式
代码如下 | 复制代码 |
function upload_img($UploadFile,$UploadFile_name,$UploadFile_size,$UploadPath,$max_size=64){ //$TimeLimit=60; //设置超时限制时间 缺省时间为 30秒 设置为0时为不限时 //set_time_limit($TimeLimit); if(($UploadFile!= “none” )&&($UploadFile != “” )){ $FileName=$UploadPath.$UploadFile_name; if($UploadFile_size <1024){ $FileSize=”(string)$UploadFile_size” . “字节”; }elseif($UploadFile_size <(1024 * $max_size)){ $FileSize=number_format((double)($UploadFile_size / 1024), 1) . ” KB”; }else{ nerror(“文件超过限制大小!”); } //{ //$FileSize=”number_format((double)($UploadFile_size” / (1024 * 1024)), 1) . ” MB”; // } if(!file_exists($FileName)){ if(copy($UploadFile,$FileName)){ return “$UploadFile_name ($FileSize)”; }else{ nerror(“文件 $UploadFile_name 上载失败!”); } unlink($UploadFile); }else{ nerror(“文件 $UploadFile_name 已经存在!”); } //set_time_limit(30); //恢复缺省超时设置 } } |
以下是一些小技巧:
PHP如何判断ip地址合法性
代码如下 | 复制代码 |
if(!strcmp(long2ip(sprintf(“%u”,ip2long($ip))),$ip)) echo “is ipn”; |
—-
email的正则判断
代码如下 | 复制代码 |
eregi(“^[_.0-9a-zA-Z-]+@([0-9a-zA-Z][0-9a-zA-Z_-]+.)+[a-zA-Z]$”, $email); |
检测ip地址和mask是否合法的例子
代码如下 | 复制代码 |
$ip = ’192.168.0.84′; $mask = ’255.255.255.0′; $network = ’192.168.0′; $ip = ip2long($ip); $mask = ip2long($mask); $network = ip2long($network); if( ($ip & $mask) == $network) echo “valid ip and maskn”; ?> |
—-
PHP文件下载头部输出如何设定
代码如下 | 复制代码 |
header(“Content-type: application/x-download”); header(“Content-Disposition: attachment; filename=$file_download_name;”); header(“Accept-Ranges: bytes”); header(“Content-Length: $download_size”); echo ‘xxx’ PHP用header输出ftp下载方式,并且支持断点续传 一个例子: header(‘Pragma: public’); header(‘Cache-Control: private’); header(‘Cache-Control: no-cache, must-revalidate’); header(‘Accept-Ranges: bytes’); header(‘Connection: close’); header(“Content-Type: audio/mpeg”); header(“Location:ftp://download:1bk3l4s3k9s2@232.2.22.22/2222/web技术开发知识库/cn_web.rmvb”); PHP正则匹配中文 ereg(“^[".chr(0xa1)."-".chr(0xff)."]+$”, $str); 批量替换文本里面的超级链接 function urlParse($str = ”){ if (” == $str) return $str; $types = array(“http”, “ftp”, “https”); $replace = << ”.htmlentities(’1′).htmlentities(’2′).” EOPHP; $ret = $str; while(list(,$type) = each($types)){ $ret = preg_replace(“|($type://)([^s]*)|ie “, $replace, $ret); } return $ret; } |