正则表达式(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) { $string = str_replace("r","",$string); $string = str_replace("n","",$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 $str = 'a1234'; if (preg_match("^[a-zA-Z0-9]{4,16}$", $str)) { echo "验证成功";} else { echo "验证失??quot;;}?> |
简易的台湾身分证字号验证
代码如下 | 复制代码 |
<?php $str = 'a1234'; if (preg_match("^(?:d{15}|d{18})$", $str)) { echo "验证成功"; } else { echo "验证失??quot;;} ?> |
下面的代码实现文字中的代码块,功能就如你在脚本之家看到的代码一样。
代码如下 | 复制代码 |
function codedisp($code) { global $discuzcodes; $discuzcodes['pcodecount']++; $code = htmlspecialchars(str_replace('\"', '"', preg_replace("/^[nr]*(.+?)[nr]*$/is", "\1", $code))); $discuzcodes['codehtml'][$discuzcodes['pcodecount']] = "<br><div class="msgheader"><div class="right"><a href="###" class="smalltxt" onclick="copycode($('phpcode$discuzcodes[codecount]'));">[复制此代码]</a></div>代码如下:</div><div class="msgborder" id="phpcode$discuzcodes[codecount]">".fhtml2($code)."</div><br>"; $discuzcodes['codecount']++; return "[tDISCUZ_CODE_$discuzcodes[pcodecount]t]"; } $message = preg_replace("/s*[code](.+?)[/code]s*/ies", "codedisp('\1')", $message); $message = preg_replace("/s*[html](.+?)[/html]s*/ies", "htmldisp('\1')", $message); |