PHP教程:详解PHP中正则表达式实例,含禁止分组捕获要点

网安智编 厦门萤点网络科技 2025-07-07 00:07 114 0
《PHP教程:PHP中的正则表达式实例详解》要点: 本文介绍了PHP教程:PHP中的正则表达式实例详解,希望对您有用。如果有疑问,可以联系我们。 最近使用 PHP 写了一个应用,主要是正则表达式的处理,趁机系统性的学习了相应知识. 这篇文章...

《PHP教程:PHP中的正则表达式实例详解》要点:

本文介绍了PHP教程:PHP中的正则表达式实例详解,希望对您有用。如果有疑问,可以联系我们。

最近使用 PHP 写了一个应用,主要是正则表达式的处理,趁机系统性的学习了相应知识.

这篇文章的写作方式不是讲理论,而是通过具体的例子来了解正则,这样也更有实践性,在此基础上再去看正则表达式的基本概念会更有收获.PHP实战

禁止分组的捕获PHP实战

在正则中分组很有用,可以定义子模式,然后可以通过后向引用来引用分组的内容,但是有的时候仅仅想通过分组来进行范围定义,而不想被分组来捕获,通过一个例子就能明白:PHP实战

$str = "http://www.google.com";
$preg= "/http:\/\/\w+\.\w+.(?:net|com|cn)+/is";
$preg2= "/http:\/\/\w+\.\w+.(net|com|cn)+/is";
preg_match($preg,$str,$arr);
preg_match($preg2,$str,$arr2);

当模式中出现?:表示这个括号的分组不会被引用,运行下例子就能明白.PHP实战

() 和 () 的区别PHP实战

() 在匹配模式的时候匹配到一次就结束,而 () 则进行全局匹配,通过一个例子就能明白:PHP实战

$str='hello world china';
$preg="/\w+\s/is";
preg_match($preg,$str,$arr);
print_r($arr);
preg_match_all($preg,$str,$arr);
print_r($arr);

正确理解 $ 和 ^PHP实战

先说一个正则,为了匹配是否是手机号:PHP实战

$str = "13521899942a";
$preg="/1[\d]{3,15}/is";
if (preg_match($preg,$str,$arr)) {
  echo "ok";
}

虽然字符串中有一个英文字母,但是这个子模式却匹配了,原因就在于模式匹配到后就结束了,不会再去寻找英文字母,为了解决这问题 $ 和 ^ 就发挥作用了,比如让字符串的开始和结尾必须匹配一定的模式,修改如下:PHP实战

$str = "13521899942a";
$preg="/1[\d]{3,15}$/is";
if (preg_match($preg,$str,$arr)) {
  echo "ok";
}

$ 和 ^ 的跨行模式PHP实战

默认的情况下,$ 和 ^ 只会匹配完整段落的开始和结尾,但是通过改变选项,允许匹配文本的每一行的开始和结尾,通过下面的例子就能明白PHP实战

$str='hello
world';
$preg='/\w+$/ism';//$preg='/(?m)\w+$/is';
preg_match_all($preg,$str,$arr);
print_r($arr);

分组命名PHP实战

在正则中通过括号分组后,可以使用 \1,\2 这样的数字进行后向引用,但是假如正则中模式太多,在使用的时候就会比较混乱,这时候可以采用分组命名来进行引用,看个例子:PHP实战

$str ="email:ywdblog@gmail.com;";
preg_match("/email:(?\w+?)/is", $str, $matches);
echo $matches["email"] . "_" . $matches['no'];

懒惰模式PHP实战

正则在匹配的时候是贪婪的,只要符合模式就会一直匹配下去,下面的例子,匹配到的文本是

PHP实战

$str = "

hello

world

"; $preg = "/

.*<\/h2>/is"; preg_match($preg,$str,$arr); print_r($arr);

通过改变一个选项可以修改为懒惰模式,就是一旦匹配到就中止,修改代码如下:PHP实战

php 正则表达式 $1_PHP正则表达式实例详解_PHP正则表达式实战应用

$str = "

hello

world

"; $preg = "/

.*?<\/h2>/is"; preg_match($preg,$str,$arr); print_r($arr);

进一步理解 ()PHP实战

通过这函数的最后一个参数,能够返回不同形式的数组:PHP实战

$str= 'jiangsu (nanjing) nantong
guangdong (guangzhou) zhuhai
beijing (tongzhou) haidian';
$preg = '/^\s*+([^(]+?)\s\(([^)]+)\)\s+(.*)$/m';
preg_match_all($preg,$str,$arr,PREG_PATTERN_ORDER);
print_r($arr);
preg_match_all($preg,$str,$arr,PREG_SET_ORDER);
print_r($arr);

强大的正则替换回调PHP实战

虽然 () 函数能完成大多数的替换,但是假如你想更好的控制,可以使用回调,不用多说看例子:PHP实战

$str = "china hello world";
$preg = '/\b(\w+)(\w)\b/';
function fun($m){
    return $m[1].strtoupper($m[2]);
}
echo preg_replace_callback($preg,"fun",$str);

在这一点上,PHP 比 强大的多, 中没有正则回调,不过可以使用闭包的方式解决,可看我以前的文章.PHP实战

()PHP实战

这个函数类似于 中的 pile() 函数,假如在模式中一些元字符仅仅想表达字符的本身含义,可以转义,但是假如在模式中写太多的转义,会显得很混乱,可以使用这个函数来统一转义:PHP实战

$str = '\\*china*world';
$preg = "\*china";
$preg = preg_quote($preg);
echo $preg;
preg_match( "/{$preg}/is",$str,$arr);
print_r($arr);

向前查找 ?= 的妙用PHP实战

用英文解释可能比较贴切:PHP实战

The "?=" means "the next text must be like this". This doesn't the text.

(1)这个例子可以获取 URL 中的协议部分,比如 https,ftp,注意 ?: 后面的部分不在返回的内容中.PHP实战

$str = "http://www.google.com";
$str = "https://www.google.com";
$preg = '/[a-z]+(?=:)/';
preg_match($preg,$str,$arr);
print_r($arr);

(2)"" 分隔符PHP实战

也叫 “zero-width” 分隔符,参考下面的例子:PHP实战

$str = ("chinaWorldHello");
$preg = "/(?=[A-Z])/";
$arr = preg_split($preg,$str);
print_r($arr);

(3)匹配强密码PHP实战

of the order that , it's that it must but we're not about the order.

The first is (?=.{8,}). This if there are at least 8 in the . The next (?=.) means "any can zero or more times, then any digit can ". So this if there is at least one in the . But since the isn't , that one digit can in the . The next (?=.) and (?=.) are for the lower case and upper case in the .

PHP实战

$str= "HelloWorld2016";
if (preg_match("/^.*(?=.{8,})(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).*$/", $str,$arr)){
  print_r($arr);
}

向后查找 ?