php正则表达式子模式的反向引用

需要用正则表达式获取字符串的标题。标题标签是h1~h6。
使用正则表达式:"@<h([1-6])>(.*?)</h\\1>@"或者'<h([1-6])>(.*?)</h\1>@'。使用了@作为分隔符,注意单双引号的差别\\1与\1.

<?php
$str='<h1>php php php php php php1</h1><h2>php php php php php php2</h2><h3>php php php php php php3</h3><h4>php php php php php php4</h4>';
preg_match_all("@<h([1-6])>(.*?)</h\\1>@",$str,$all);
print_r($all);
?>
结果
Array
(
    [0] => Array
        (
            [0] => <h1>php php php php php php1</h1>
            [1] => <h2>php php php php php php2</h2>
            [2] => <h3>php php php php php php3</h3>
            [3] => <h4>php php php php php php4</h4>
        )

    [1] => Array
        (
            [0] => 1
            [1] => 2
            [2] => 3
            [3] => 4
        )

    [2] => Array
        (
            [0] => php php php php php php1
            [1] => php php php php php php2
            [2] => php php php php php php3
            [3] => php php php php php php4
        )

)

php正则表达式获取字符串的重复情况

正则表达式获取字符串的重复情况需要对指定的字符串使用括号()进行分组,但不想让圆括号中的字模式匹配的文本出现在包含匹配文本的数组中,可以使用问号冒号?:
把?:放在第一个圆括号的后面就可以。
例如匹配dx在字符串中重复的情况使用/(?:dx)+/,加号表示dx出现1次或是多次

<?php
$str='1.aadxaaa 2.bdxdxbb2bbb 3.cccc2ccc 4.dxdxdxdddddxdxdx';
preg_match_all("/(?:dx)+/",$str,$all);
print_r($all);
?>

输出:
Array
(
    [0] => Array
        (
            [0] => dx
            [1] => dxdx
            [2] => dxdxdx
            [3] => dxdxdx
        )

)

php正则表达式中的贪婪匹配与非贪婪匹配

贪婪模式匹配的原则是:
在可匹配也可不匹配的情况下, 优先匹配,直到不能匹配成功的情况下,记录备选状态,并把匹配控制交给正则表达式的下一个匹配字符,当之后的匹配失败的时候,再回溯,进行匹配。
它会匹配尽可能多的字符。它首先看整个字符串,如果不匹配,对字符串进行收缩;遇到可能匹配的文本,停止收缩,对文本进行扩展,当发现匹配的文本时,它不着急将该匹配保存到匹配集合中,而是对文本继续扩展,直到无法继续匹配 或者 扩展完整个字符串,然后将前面最后一个符合匹配的文本(也是最长的)保存起来到匹配集合中。所以说它是贪婪的。
举例说明:
preg_match 函数会返回第一个匹配的字符串。
现在有下面字符串
$str= "Nothing can <b>replace</b> a <b>mother</b>'s love."
现在想要获取第一个<b>replace</b>的内容。
1.贪婪匹配

<?php
$str= "Nothing can <b>replace</b> a <b>mother</b>'s love.";

// 贪婪匹配返回最大的字符串
$IsMatch= preg_match('/<b>(.*)<\/b>/', $str, $match);
if( $IsMatch ){
  print_r($match) . "\n" ;
}
/*
输出:
Array
(
    [0] => <b>replace</b> a <b>mother</b>
    [1] => replace</b> a <b>mother
)
*/
?>

没有得到想要的内容。贪婪匹配返回最大的字符串。

下面使用非贪婪匹配的办法
具体方法有两种使用修饰符U或者是?。

<?php
$str= "Nothing can <b>replace</b> a <b>mother</b>'s love.";

// 使用?非贪婪匹配返回最小的字符串
$IsMatch= preg_match('/<b>(.*?)<\/b>/', $str, $match);
if( $IsMatch ){
  print_r($match) . "\n" ;
}
/*
输出:
Array
(
    [0] => <b>replace</b>
    [1] => replace
)
*/

?>

<?php
$str= "Nothing can <b>replace</b> a <b>mother</b>'s love.";

// 使用U非贪婪匹配返回最小的字符串
$IsMatch= preg_match('/<b>(.*)<\/b>/U', $str, $match);
if( $IsMatch ){
  print_r($match) . "\n" ;
}
/*
输出:
Array
(
    [0] => <b>replace</b>
    [1] => replace
)
*/

?>

非贪婪匹配得到了想要的结果。