PHP正则表达式

定界符

正则表达式语句需要由分隔符(定界符)闭合包裹,分隔符可以使任意非字母数字, 非反斜线, 非空白字符
经常使用的分隔符是正斜线(/), hash符号(#) 以及取反符号(~)
建议使用//做为定界符,因为与js一致

$status =  preg_match('/pattern/', 'a string contains pattern');
var_dump($status); // 1,不匹配返回0

元字符

元字符是正则表达式中的最小元素,只代表单一字符。下面是元字符列表

元字符 说明 范围
\d 匹配任意一个数字 [0-9]
\D 与除了数字以外的任何一个字符匹配 [^0-9]
\w 与任意一个英文字母,数字或下划线匹配 [a-zA-Z_0-9]
\W 除了字母,数字或下划线外与任何字符匹配 [^a-zA-Z_0-9]
\s 与任意一个空白字符匹配 [\n\f\r\t\v]
\S 与除了空白符外任意一个字符匹配 [^\n\f\r\t\v]
\n 换行字符
\t 制表符
var_dump(preg_match('/\d/', '1'));
var_dump(preg_match('/\D/', 'h'));
var_dump(preg_match('/\w/', '_'));
var_dump(preg_match('/\W/', '@'));
var_dump(preg_match('/\s/', ' '));
var_dump(preg_match('/\S/', 'h'));
var_dump(preg_match('/\n/', "\n"));
var_dump(preg_match('/\n/', '
'));
var_dump(preg_match('/\t/', "\t"));

元字符表(原子表)

在一组字符中匹配某个元字符,在正则表达式中通过元字符表来完成,就是放到方括号中

原子表 说明
[] 只匹配其中的一个原子
[^] 只匹配"除了"其中字符的任意一个原子
[0-9] 匹配0-9任何一个数字
[a-z] 匹配小写a-z任何一个字母
[A-Z] 匹配大写A-Z任何一个字母
. 点在正则中表示除换行符外的任意字符

匹配聊了 678外的任何字符

$status = preg_match('/[^678]/', 678);
var_dump($status);

通过原子表拆分字符串

$str ="1.jpg@2.jpg@3.jpg#4.jpg";
$arr = preg_split('/[@#]/',$str); //按正则表达式拆分字符串
print_r($arr); //输出结果 Array ( [0] => 1.jpg [1] => 2.jpg [2] => 3.jpg [3] => 4.jpg )

原子组

  • 如果一次要匹配多个元子,可以通过元子组完成
  • 原子组与原子表的差别在于原子组一次匹配多个元子,而原子表则是匹配成功表中的一个元字符就可以
  • 元字符组用()表示
  • \0表示所有匹配结果

\1表示匹配的第一个分组

$str = "aaabcbb.cc";
$preg = "/(abc)edfg(dc)is/";
$newStr= preg_replace($preg, '<span style="color:#f00">\1</span>wang\2', $str);
echo $newStr;

匹配字符边界

如果想匹配字符的边界,边界包括空格、标点符号、换行等,可以使用正则表达式的匹配字符边界修饰符如下

符号 说明
^ 匹配字符串的开始
$ 匹配字符串的结束,忽略换行符
$status = preg_match('/^abc$/', 'abbbbc');
var_dump($status); //返回真

选择修释符

| 这个符号代表选择修释符,也就是 | 左右两侧有一个匹配到就可以

下面是通过选择修释符将域名修改为 alfalfaw

$str = "http://www.baidu.com与http://www.sina.com";
$preg = "/\.(baidu|sina)\./is";
echo preg_replace($preg, '.alfalfaw.', $str);
// http://www.alfalfaw.com与http://www.alfalfaw.com

匹配域名后缀

$str = '有问题就上google.com 或 baidu.com';
$preg = '/(google|baidu)\.com/';
$replace = '<a href="http://www.\1.com">\1.com</a>';
echo preg_replace($preg, $replace, $str);

重复匹配

如果要重复匹配一些内容时我们要使用重复匹配修饰符

符号 说明
* 重复零次或更多次
+ 重复一次或更多次
? 重复零次或一次
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次
var_dump(preg_match('/^.*$/', '')); //* 零个及空字符串也是可以的
var_dump(preg_match('/^[0-9]+$/', '1976')); // 返回真
var_dump(preg_match('/^9?$/', '99')); // 返回假
var_dump(preg_match('/^9{2}$/', '99')); // 返回真
var_dump(preg_match('/^[0-9]{2,}$/', '123')); //返回真
var_dump(preg_match('/^[0-9]{2,3}$/', '1234')); // 返回假,只能2~3位

下面匹配域名操作

$web = 'sina.com';
var_dump(preg_match('/^[a-z-0-9-]+\.(com|net|com\.cn|org|cn)$/', $web));

下面是把 h1标签内容加上超链接

$str = <<<html
<h1>hello houdunren</h1>
html;
echo preg_replace('/<h1>(.+)<\/h1>/', '<a href="http://www.baidu.com">\1</a>', $str);

注意:外层用双引号,里面的\1需要变为\\1

禁止重复匹配

正则表达式在进行重复匹配时,默认是贪婪匹配模式,可以通过?进行修饰来禁止重复匹配

符号 说明
*? 重复任意次,但尽可能少重复
+? 重复1次或更多次,但尽可能少重复
?? 重复0次或1次,但尽可能少重复
{n,m}? 重复n到m次,但尽可能少重复
{n,}? 重复n次以上,但尽可能少重复
$str = '123456';
preg_match('/\d+?/',$str,$matches);
print_r($matches);

因为增加了 ? 所以只匹配数字1
下面是使用禁止贪婪符替换将h1标签内容倾斜处理

$str = "<h1>你好</h1><h1>alfalfaw</h1>";
$preg = '/<h1>(.*?)<\/h1>/';
$replace = '<h1><em>\1</em></h1>';
echo preg_replace($preg,$replace,$str);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 正则表达式 php 正则表达式学习笔记 什么是正则表达式 正则表达式(Regular Expressions(Pe...
    Muxi_k阅读 371评论 0 0
  • 正则表达式介绍 正则表达式简介 正则表达式是用于描述字符排列和匹配模式的一种语法规则。它主要用于字符串的模式分割、...
    dptms阅读 11,045评论 1 9
  • 1,与Javascript 正则替换不同,PHP preg_replace() 默认就是替换所有符号匹配条件的元素...
    努力前进_7d51阅读 287评论 0 0
  • 因为比较重要,所以还是单独拿出来作一篇文章,好好学习一下。 正则表达式:Regular expression 定义...
    齐舞647阅读 1,411评论 3 7
  • 1.PHP正则表达式函数 2.正则表达式基本语法 界定符,原子,量词,边界控制,模式单元 2.1界定符 表示一个正...
    AGEGG阅读 360评论 0 0

友情链接更多精彩内容