Discuz!大师网

搜索
查看: 1478|回复: 1

php网站建设之正则表达式

[复制链接]
发表于 2013-6-5 14:57:25 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
正则 是分析 所要找出的那些字符串的 字符组合规则,通过这个规则来写出一个“通用”模式的字符串,用于操作在某一文本中,符合这一模式的部分或所有的字符串。
比如:找出某一杏彩平台网页中所有的Email地址。那么首先要分析Email具有哪些规则及特征,根据这些规则及特征写出一个正则表达式,然后在用于匹配该网页中的文本,最后找出Email地址。

PHP有两种正则模式,第一种是传统的POSIX正则函数,它们以ereg开头,表示扩展的正则表达式。
第二种是Perl语法的正则表达式,它们以preg开头。
前一种一般不再使用。因为它的效率和规范都不如后者。

正则表达式,实质是具有某一特征的字符串的通用模型,因此它是以 ‘ ‘ 括起来的,紧贴嵌在引号内的是一对定界符(Perl语法的,不适用POSIX),定界符可以由任一对符号组成。在定界符内是正则内容。正则内容通常由字符组合、限定表达式和模式修正符三部分组成。

101 字符组合

字符组合是由正则字符和正则符号构成的。

1011正则符号

正则符号通常包括:定界符、[ ] 、| 、^ 、$ 、- 、( ) 。它们有着各自不同的意义。
定界符:是用于将匹配的内容包括起来,它是引号后紧跟着的符号,它是成对出现的,在结尾处引号前也有一个该符号。它只适用preg的正则表达式。
例 10-1. 找出不文明词语「我靠」,用「*」来代替。
<?php
$patern="/我靠/";
$html=<<<_HTML_
我靠你是靠不住了!我靠我自己的力量!
_HTML_;
$replacement="*";
$html=preg_replace($patern,$replacement,$html);
print $html;
?>
在上例中,第一句是一个正则表达式,其中 / 表示定界符,也可以用其它的符号诸如 @ 或 # 等来代替。总之,正则表达式引号后的第一个符号即是定界符,它是成对的出现的,在结束引号前也有一个配对的定界符,在这一对定界符内的内容即是要匹配的内容。第六句使用了一个正则表达式函数preg_replace ( ) 。里面传入了三个参数,第一个参数是一个正则表达式,第二个参数是将文本中所匹配到的字符串替换成为的字符串,第三个参数是在哪个文本中进行匹配。
preg_replace ( $patern , $replacement , $subcontext , $limiter ) 实际共有四个参数。最后一个参数缺省值为NULL,表示全部替换。如果传入一个数值,表示替换该数值的个数。前两个参数可以是数组,它一一对应进行替换。

例10-2. 判断是否含有不文明词语,使用preg_match ( )函数。
<?php
$patern="#我靠#";
$sub=<<<_HTML_
我靠你是靠不住了!
我靠我自己的力量!
_HTML_;
$bln=preg_match($patern,$sub);
if($bln) print "含有非不文明词语!";
?>

[  ] 方括号
方括号,表示匹配任一方括号内的字符。如:[abc] 表示匹配 a 或 b 或 c 。

例10-3 匹配输入的符串中是否含有 a 或 b 或 c 。
<?php
if(NULL!=($sub=fgets(STDIN))){
$patern="/[abc]/";
$n=preg_match_all($patern,$sub,$arr);
print "匹配到".$n."个\n";
}
?>
在上例中,输入一个字符串,如果该字符串包含a、b、c任意一个,都会匹配成功。第三句使用了一个preg_match_all ( ) 函数,该函数返回一个数值,表示匹配了多少个。上例中传入了三个参数,第三个参数是一个数组的引用,它将数组的内容改写成所匹配到的内容的数组。

回复 马甲回复

使用道具 举报

 楼主| 发表于 2013-6-5 14:57:46 | 显示全部楼层
| 或运算符
表示匹配任何其中的一个。注意运算符与字符间不能含有空格,否则空格会被当成所匹配内容的一部分。

例10-4 匹配两个中的任何一个
<?php
print "匹配 you 或 me,请输入:\n";

if(NULL!=($sub=fgets(STDIN))){
$patern="/you|me/";
$n=preg_match_all($patern,$sub,$arr);
print "匹配到".$n."个\n";
print_r($arr);
}
?>

^ 运算符
一、表示不含 ^ 符号后面的字符;
二、表示以 ^ 符号后面字符开头的字符串。

例10-5 匹配不含字符A。
<?php
print "匹配非A,请输入:\n";

if(NULL!=($sub=fgets(STDIN))){
$patern="/[^A]/";
$n=preg_match_all($patern,$sub,$arr);
print "匹配到".$n."个\n";
print_r($arr);
}
?>
在上例中,^A要用方括号括起来,否则就会表示匹配以A开头的字符串。 ^ 还有另外一种作用,表示匹配以 ^ 后面的字符开头的字符串。

例10-6 匹配一个以B开头的字符串。
<?php
print "匹配以B开头。请输入:\n";

if(NULL!=($sub=fgets(STDIN))){
$patern="/^B/";
$n=preg_match($patern,$sub);
if($n) print "B开头。";
else print "不是B开头。";
}
?>

$ 修正符
表示以 $ 前字符结的字符串。

例10-7 判断一个字符串是否以 ed 结尾。
<?php
print "匹配以ed结尾。请输入:\n";

if(NULL!=(fscanf(STDIN,"%s",$sub))){
$patern="/ed$/";
$n=preg_match($patern,$sub);
if($n) print "是ed结尾。";
else print "不是ed结尾。";
}
?>

- 连接符
它只能用在方括号内,表示从 – 前面的字符到 – 后面的字符。如a-z表示从a到z。

例10-8 判断表单内容是否含有小写字母。
判断表单内容是否含有小写字母。请输入内容:
<?php
print "匹配是否含有小写字母。请输入:\n";
fscanf(STDIN,"%s",$sub);
$patern="/[a-z]/";
$n=preg_match($patern,$sub);
if($n) print "是!";
else print "否";
?>

()圆括号
表示嵌套的正则表达式。圆括号将正则表达式分层进行嵌套,使得正则表达式特别灵活。详见本章10.5节。

例10-9 判断是否含有字符串 qq 。
<?php
print "是否含有qq字符串。请输入:\n";
fscanf(STDIN,"%s",$sub);
$patern="/(qq)/";
$n=preg_match($patern,$sub);
if($n) print "是!";
else print "否";

?>
在上例中,如果输入一个qaq ,点击测试会打印出“不含!”。因为它将 qq 作为一个整体来进行匹配。’/(qq)/ ’ 与 ‘/qq/ ‘ 有些近似,但两者是有区别的,前者会把匹配内容作为一个整体,因此可以进行整体操作。


1012 正则字符

正则字符通常包括普通字符、转义字符、还原字符、标记字符。
普通字符
一般的字符都可以看作普通字符,包括abcdABCD_…1234…*%#…等等。

转义字符
它是以 \ 来进行转义的,以下是最常用的转义字符:
\b 匹配一个单词边界。  
\B 匹配非单词边界。
\cx 匹配由x指明的控制字符。
\f 匹配一个换页符。
\n 匹配一个换行符。
\r 匹配一个回车符。
\t 匹配一个制表符。
\v 匹配一个垂直制表符。

每个字母、每个unicode字符都可以用转义字符来表示。例如: \u00A9 匹配版权符号。关于每个字符的对应转义字符,可以到网上去查询有关资料。
例10-10 统计某一文本中有多少行。
新建立一个文本名为:test_17_10.txt 保存在当前目录下,在里面输入几行。再写PHP文本,内容如下:
<?php
$text=file_get_contents("test_17_10.txt");
$patern="/\n/";
$n=preg_match_all($patern,$text,$arr);
print $n;
?>

例10-11 将提交过来的文本中的换行符 \ n替换为网页格式的换行符<br />
<?php
print "将回车、换行替换为<br />。用q结束输入。请输入:\n";
while("q\r\n"!=($sub=fgets(STDIN))){
$patern="/\r|\n/";
print preg_replace($patern,"<br />",$sub);
}
?>

还原字符
还原字符又称使见字符(使某个特殊字符可见)。还原符是将有特殊作用的字符还原成普通字符,它通常也是以 \ 来进行还原。比如:将 / 作为定界符,当在正则内容中要匹配 / 时,要进行还原,也就是用 \ / 形式来还原定界符。

例10-12 匹配定界符。
<?php
$patern="@\@@";
$text="XXXXX";
$n=preg_match_all($patern,$text,$arr);
print $n;
?>
在上例中,当 @ 号被用作定界符时,如果它赤裸地出现在匹配内容中,会被当成定界符使用,因此程序会报错。此时如果要匹配它,必须使用还原符 \ 将 @ 号还原成普通的字符。还原字符主要应用在:
1.正则符号
2.原简符
3.\ 本身
4.定界符

例10-13 匹配正则符号
<?php
$patern="/[\)\(\]\[\^\$\-\|]/";
$text="[(1+2)*3]-15";
$n=preg_match_all($patern,$text,$arr);
print "匹配到".$n."个\n";
print_r($arr);
?>

标记字符
标记字符是已经存储在内存中的字符,用 \ 调用其编号调出其对应的字符。

例10-14 匹配一个与先前已匹配好的字符
<?php
$patern="#<(\w+)>.*</\1>#";
$text="<h1>你好,正则!</h1>";
$n=preg_match_all($patern,$text,$arr);
print $n."\n";
print_r($arr);
?>
在上例中,()括起来的正则内容,一旦被匹配,其内容被保存在内存中,在后面的可以用 \ 加上其标号1将其调出。
\w 、+ 、 . 、 * 是简化符,将在后面给予解释。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|网站地图|小黑屋|展会网|Discuz站长论坛 |天天打卡

GMT+8, 2024-4-25 02:18 , Processed in 0.029306 second(s), 7 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表