编程语言
C#编程语言基础
C#面向对象与多线程
C#数据及文件操作
JavaScript基础
JavaScript的数据类型和变量
JavaScript的运算符和表达式
JavaScript的基本流程控制
JavaScript的函数
JavaScript对象编程
JavaScript内置对象和方法
JavaScript的浏览器对象和方法
JavaScript访问HTML DOM对象
JavaScript事件驱动编程
JavaScript与CSS样式表
Ajax与PHP
ECMAScript6的新特性
Vue.js前端开发
PHP的常量与变量
PHP的数据类型与转换
PHP的运算符和优先规则
PHP程序的流程控制语句
PHP的数组操作及函数
PHP的字符串处理与函数
PHP自定义函数
PHP的常用系统函数
PHP的图像处理函数
PHP类编程
PHP的DataTime类
PHP处理XML和JSON
PHP的正则表达式
PHP文件和目录处理
PHP表单处理
PHP处理Cookie和Session
PHP文件上传和下载
PHP加密技术
PHP的Socket编程
PHP国际化编码
MySQL数据库基础
MySQL数据库函数
MySQL数据库账户管理
MySQL数据库基本操作
MySQL数据查询
MySQL存储过程和存储函数
MySQL事务处理和触发器
PHP操作MySQL数据库
数据库抽象层PDO
Smarty模板
ThinkPHP框架
Python语言基础
Python语言结构与控制
Python的函数和模块
Python的复合数据类型
Python面向对象编程
Python的文件操作
Python的异常处理
Python的绘图模块
Python的NumPy模块
Python的SciPy模块
Python的SymPy模块
Python的数据处理
Python操作数据库
Python网络编程
Python图像处理
Python机器学习
TensorFlow深度学习
Tensorflow常用函数
TensorFlow用于卷积网络
生成对抗网络GAN
正则表达式,是对字符串操作的一种逻辑公式,就是用事先定义好的一些特殊字符及这些特定字符的组合,组成一个“规则字符串”,用来表示对字符串一种过滤逻辑。PHP支持两种类型的正则表达式,POSIX类型和Perl类型。
一、POSIX正则表达式:
1.POSIX正则表达式语法:
POSIX正则表达式的结构和一般的数学表达式相似,由多个操作符(元素)组合在一起构成一个更复杂的表达式。这种组合不仅可以找到或者匹配表达式(如某个单词或数字),还可以找到许多语义不同但语法相似的字符串(如HTML标记)。
POSIX中支持三种语法来定义正则表达式,分别是中括号、量词和预定义字符。
①中括号:
POSIX正则表达式的中括号([])表示在一定的范围内查找字符,可以在中括号内设置要查找的字符序列。例如,[abc]表示匹配在这3个字符之间的字符串。
为了表示方便,可以在中括号内使用短横线连接两个字符串来表示一个连续的范围。例如,[0-9]就表示0到9之间的数字,还可以用[2-8]和[c-y]等。下表列出常用的字符范围:
常用形式 |
说明 |
[0-9] |
匹配任何从0到9之间的十进制数字 |
[a-z] |
匹配任何从小写a到z之间的字符 |
[A-Z] |
匹配任何从大写A到Z之间的字符 |
[A-Aa-z] |
匹配任何从大写A到小写z之间的字符 |
②特殊字符:
在中括号中指定字符范围时有明显的局限性,当字符串较长时比较繁琐。POSIX正则表达式中定义了一些特殊字符和表达式,用于简化类似复杂情况下的正则表达式写法。
常用形式 |
说明 |
p+ |
匹配任何一个至少包含p的字符串 |
p* |
匹配任何包含零个或多个p的字符串 |
p? |
匹配任何包含零个或一个p的字符串 |
p{2} |
匹配任何包含两个p序列的字符串 |
p{2,3} |
匹配任何包含两个或3个p序列的字符串 |
p{2.} |
匹配任何至少包含两个p序列的字符串 |
p$ |
匹配任何以p结尾的字符串 |
^p |
匹配任何以p开头的字符串 |
[^a-aA-Z] |
匹配任何不包括从a到z和从A到Z的字符串 |
p.p |
匹配任何包括字符p、接下来是任何字符串、再接下来又是p的字符串 |
^.{2}$ |
匹配任何只包含两个字符的字符串 |
<b>(.*)</b> |
匹配任何被<b>和</b>包围的字符串 |
p(hp)* |
匹配任何包含一个p,后面是零个或多个hp的字符串 |
{a|b} |
匹配任何包含a或者b的字符串 |
要注意:^符号在中括号之外表示字符串的开头,在中括号内时表示取反,有排除的意思。例如,^h可以匹配hello,而不能匹配the;^[^0-9][0-9]表示第1个字符不能是数字,而第2位是数字,比如-2、H2、@2等,但不能匹配02或22。
下面列出了^符号用于排除字符的常规用法:
·[^0-9]:匹配除了数字以外的所有字符。
·[^a-z]:匹配除了小写字母以外的所有字符。
·[^A-Z]:匹配除了大写字母以外的所有字符。
·[^\\\/\^]:匹配除了\、/和^以外的所有字符。
·[^\"\']:匹配除了双引号和单引号以外的所有字符。
③预定义字符:
POSIX正则表达式中还可以使用一些预定义的字符表示范围。预定义字符可以指定整个字符范围,例如字母或整数集。下表列出常用的预定义字符:
字符 |
描述 |
扩展 |
[:alnum:] |
字母和数字字符 |
[0-9a-zA-Z] |
[:alpha:] |
字母字符(字母) |
[a-zA-Z] |
[:ascii:] |
7位ASCII |
[\x01-\x7F] |
[:blank:] |
水平空白符(空格、制表符) |
[\t] |
[:cntrl:] |
控制字符 |
[\x01-\x1F] |
[:digit:] |
数字 |
[0-9] |
[:lower:] |
小写字母 |
[a-z] |
[:print:] |
可打印字符(图形类加空格和制表符) |
[\t\x20-\xFF] |
[:punct:] |
任意标点符号,如句号和分号 |
[-!"#$%&'()*+,./:;<=>?@[\\\]^_'{|}~] |
[:space:] |
空白(换行、回车、制表符、空格、垂直制表符) |
[\n\r\t \x0B] |
[:upper:] |
大写字母 |
[A-Z] |
[:xdigit:] |
十六进制数字 |
[0-9a-fA-F] |
每一个预定义字符都可以被用于替代一类字符。例如,要查找任一个小写字母或者一个数字,可以使用下面的正则表达式:
[[:lower:] [:digit:]]
但是不能把一个预定义字符当作一个范围的终点使用。
2.POSIX正则表达式函数:
PHP提供了4个专门用于POSIX正则表达式的处理函数。
①ereg()函数:
ereg()函数用于在字符串中查找匹配正则表达式的子字符串。语法格式为:
int ereg (string $pattern, string $string [, array $regs])
其中,$pattern表示正则表达式,$string表示要查询的字符串。如果定义了可选参数$regs,那么当找到与$pattern模式相匹配的子串时,匹配项将被存入$regs数组中。$regs[1]包含第一个左圆括号开始的子串,$regs[2]包含第二个子串,以此类推,而$regs[0]则包含整个匹配的字符串。示例:
<?php
$date=Date("2016-12-25'); //指定一个日期
if (ereg("([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})", $date, $regs)) //使用正则表达式
{
echo "匹配成功,返回的数组如下:\n";
print_r($regs); //输出匹配的数组
}else{
echo "非法的日期格式:$date";
}
?>
执行后输出结果为:
匹配成功,返回的数组是:
Array
(
[0]=>2016-12-25
[1]=>2016
[2]=>12
[3]=>25
)
②eregi()函数:
eregi()函数的语法与ereg()函数完全相同,唯一不同的是eregi()函数在匹配时不区分大小写。示例:
<?php
$str="www.dwenzhao.cn"; //指定一个字符串
if (eregi("DWEN", $str)) //匹配DWEN,不区分大小写
{
echo $str."这个字符串中包含字符DWEN。";
}
?>
③ereg_replace()函数:
ereg_replace()函数用于将字符串中与正则表达式相匹配的子字符串替换成指定字符串。语法格式为:
int ereg_replace (string $pattern, string $replacement, string $string)
其中,$pattern不是正则表达式,$replacement表示用于替换的字符串,$string表示原始字符串。ereg_replace()函数在$string中扫描与$pattern匹配的部分,并将其替换为$replacement,最后返回替换后的字符串;如果没有可供替换的匹配项则会返回原字符串。示例:
<?php
$str="Saturday Thursday Friday";
echo str_replace("satur", "Mon", $str); //替换字符串
$text="本站网址 www.dwenzhao.cn";
$text=ereg_replace("[^<>[:space:]]+[[:alnum:]/]", "<a href=\"http://\\0\">\\0</a>", $text);
?>
④eregi_replace()函数:
eregi_replace()函数的语法与ereg_replace()函数完全相同,唯一不同是eregi_replace()函数在替换时不区分大小写。示例:
<?php
$pattern='[A-Z]{5}';
$repStr=”WWW”;
$str="asdfg:Face:gfdsa";
$result=eregi_replace($pattern, $repStr, $str); //替换后结果为:WWW.Face.W
?>
二、Perl正则表达式:
这种正则表达式源自Prel语言,Perl语言也是对字符串操作功能最强大的语言之一。PHP引入了这种风格的正则表达式语法。
1.Perl正则表达式语法:
①定界符:
Perl风格正则表达式要求每个模式都必须用一对定界符括起来,习惯上使用一对斜线(/)作为定界符,例如/pattern/。不过,任意非数字和字母的字符(除了反斜线\)都可以作为定界符,尤其是在匹配的字符串中本身包含斜线时,一般用其他字符作为定界符。
示例:字符串D:/music/ting,可以使用正则表达式/D:\/music\/ting/来匹配该字符串,由于字符串中包含有斜线符,所以在其他斜线符前面都需要添加反斜线进行转义,此时应使用其他字符作为定界符,如使用#为定界符,#D:/music/ting#,不再需要转义符。
②修饰符:
在正则表达式匹配时,可能需要不区分大小写或者只查找第一个相匹配的字符串等,这些要求可以通过修饰符来实现。下表列出了Perl正则表达式中常见的修饰符:
修饰符 |
含义 |
i |
不区分大小写进行匹配 |
m |
将一个字符串视为多行。默认情况下,^和$字符匹配字符串中的最开始和最末尾。使用m修饰符将使^和$匹配字符串中每一行的开始 |
s |
将一个字符串视为一行,忽略其中的换行符。与m修饰符正好相反。 |
x |
忽略正则表达式中的空白和注释 |
U |
第一次匹配后停止,即查找到第一个字符串后停止后面的搜索。 |
修饰符一般直接放在正则表达式的后面。示例:
/Php/i
正则表达式/Php/原本只可以匹配字符串Php,而在使用了修饰符i后,就可以匹配字符串php、PHP、或者pHP等。多个修饰符还可以同时使用,例如/P h p/ix。
③预定义字符:
预定义字符用于设置正则表达式的匹配范围,总是以一个反斜线“\”开始,后面跟一个字母。下表列出了常用的预定义字符:
元字符 |
含义 |
\A |
只匹配字符串开头 |
\b |
匹配单词边界 |
\B |
匹配除单词边界外的任意字符 |
\d |
匹配数字字符,与[0-9]相同 |
\D |
匹配非数字字符 |
\s |
匹配空白字符 |
\S |
匹配非空白字符 |
\w |
匹配任何只包含下划线和字母数字字符的字符串,与[a-zA-Z0-9_]相同。 |
\W |
匹配没有下划线和字母数字字符的字符串 |
每个预定义字符只能匹配一个字符,如果要匹配多个,同样可以使用POSIX正则表达式中的特殊字符,比如/\d+/。
示例:一些正则表达式及其解释
/a/ //可以匹配任意包含字符a的字符串
/\ba/ //可以匹配任意以字符a开头的字符串
/a\b/ //可以匹配任意以字符a结尾的字符串
/\ba\b/ //可以匹配包含有单独的单词a的字符串
/a\B/ //可以匹配任意包含字符a的字符串。如果只含一个a,则a不能是结尾字符
2.Perl正则表达式函数:
处理Perl正则表达式的函数主要有4个。
①preg_match()函数:
preg_match()函数用于从目标字符串中搜索与指定正则表达式相匹配的内容。语法格式为:
int preg_match (string $pattern, string $subject[, array $matches[, int $flags=0[, int $offset=0]]])
preg_match()函数返回$pattern所匹配的次数。不过该函数在第一次匹配之后将停止搜索,所以如果没有匹配返回0,否则返回1。示例:
$result=preg_match("/gi/i", $str); //不区分大小写匹配gi
$result=preg_match("/\bre\b/i", $str); //只有独立的re会被匹配
$result=preg_match('#\d{4}-\d{1,2}-\d{1,2}#', $dateStr, $matches); \\匹配日期
$result=preg_match('#\d+#', $date, $matches); \\数字
②preg_match_all()函数:
preg_match_all()函数的作用与preg_match()函数相近,不同的是preg_match_all()函数会一直搜索到目标字符串的结尾处。语法格式为:
int preg_match_all (string $pattern, string $subject, array $matches[, int $flags= PREG_PATTERN_ORDER[, int $offset=0]])
该函数在执行时将搜索$subject中所有匹配$pattern给定正则表达式的匹配结果,并且将它们以$flags指定顺序输出到$matches中。最终返回完整匹配次数(可能是0),如果发生错误则返回false。示例:
$result=preg_match_all('#\d{4}-\d{1,2}-\d{1,2}#', $str, $matches, PREG_SET_ORDER);
③preg_replace()函数:
preg_replace()函数的语法格式为:
mixed preg_replace (mixed $pattern, mixed $replacement, mixed $subject[, int $limit= -1[, int $count]])
它将搜索$subject中匹配$pattern的部分,并使用$replacement进行替换。可选的$limit用于限定匹配次数,如果指定了$count,将会被填充为完成的替换次数。示例:
$badwords=array("/猪头/", "/垃圾/", "/去死/"); //要替换的关键字
$goodwords=array("宝贝", "可爱", "一边玩去"); //要替换的关键字
$result=preg_replace(badwords, $goodwords, $words);
④preg_replace_callback()函数:
preg_replace_callback()函数可以实现调用指定函数来处理字符串替换操作。语法格式为:
mixed preg_replace_callback (mixed $pattern, callback $callback, mixed $subject[, int $limit= -1[, int $count]])
与preg_replace()函数相比,preg_replace_callback()函数除了可以指定一个$callback替代preg_replace()函数中的$replacement进行替换字符串的计算之外,其他方面都完全相同。
preg_replace_callback()函数在实际中非常有用,例如对论坛、博客或者新闻评论的非法言论和文字进行过滤。示例:
<?php
function translate($match) //自定义的正则表达式替换函数
{
$arr=array( //定义替换列表
':face:'=>'<img src="smile.jpg">', //键为匹配的关键字,值为替换的内容
':qq:'=>'12345678',
':homepage:'=>'www.dwenzhao.cn',
':hello:'=>"你好呀",
);
if (isset($arr[$match[0]])){ //如果找到匹配的,则使用列表中对应的值
return $arr[$match[0]];
}else{ //没有则使用原始内容
return $match[0];
}
}
$words=":hello:, 我的朋友:face:,我的个人网站::homepage:,QQ:qq:";
$result=preg_replace_callback("/:\w+:/", 'translate', $words);
echo $result;
?>
上述代码在preg_replace_callback()函数中调用translate()函数进行字符串替换处理,在translate()函数中将传递过来的字符串与数组arr中的键进行比较。如果存在此键,则获得对应的值,并替换后输出。