phppregmatchall函数用于执行一个全局正则表达式匹配

PHP / 798人浏览 / 0人评论

preg_match_all() 函数,搜索 subject 中所有匹配 pattern 给定正则表达式的匹配结果并且将它们以 flag 指定顺序输出到 matches 中。在第一个匹配找到后, 子序列继续从最后一次匹配位置搜索。

了解下PHP函数preg_match_all()的使用方法,在做开发的时候会用到,能不能熟练掌握这个函数还需要平时在项目中多练,或者工作之余了解并实战,以便加深印象,以及给出一些案例解释。

preg_match_all() 函数

执行全局正则表达式匹配

支持版本:

(PHP 4, PHP 5, PHP 7)

__sleep()定义以及用法:

int preg_match_all ($pattern, $subject, $matches, $flags, $offset)

搜索subject中所有匹配pattern给定正则表达式 的匹配结果并且将它们以flag指定顺序输出到matches中。在第一个匹配找到后, 子序列继续从最后一次匹配位置搜索。

preg_match_all()参数解释:

参数描述
pattern要搜索的模式,字符串形式。
subject输入字符串。
matches多维数组,作为输出参数输出所有匹配结果, 数组排序通过flags指定。
flags可以结合下面标记使用(注意不能同时使用PREG_PATTERN_ORDER和 PREG_SET_ORDER):
PREG_PATTERN_ORDER结果排序为$matches[0]保存完整模式的所有匹配, $matches[1] 保存第一个子组的所有匹配,以此类推。

flags标记

标记描述
PREG_PATTERN_ORDER结果排序为$matches[0]保存完整模式的所有匹配, $matches[1] 保存第一个子组的所有匹配,以此类推。
PREG_SET_ORDER结果排序为$matches[0]包含第一次匹配得到的所有匹配(包含子组), $matches[1]是包含第二次匹配到的所有匹配(包含子组)的数组,以此类推。
PREG_OFFSET_CAPTURE如果这个标记被传递,每个发现的匹配返回时会增加它相对目标字符串的字节偏移量。 注意这会改变matches中的每一个匹配结果字符串元素,使其 成为一个第0个元素为匹配结果字符串,第1个元素为 匹配结果字符串在subject中的偏移量。
PREG_UNMATCHED_AS_NULL传入此标记,未匹配的子组报告为 null;否则会是空 string。
offset通常, 查找时从目标字符串的开始位置开始。可选参数offset用于 从目标字符串中指定位置开始搜索(单位是字节)。

如果没有给定排序标记,假定设置为PREG_PATTERN_ORDER。

preg_match_all()返回值

返回完整匹配次数(可能是0),或者如果发生错误返回false。

演示代码:

在HTML标签中查找匹配a标签,以及a标签中的属性以及内容等:

以下preg_match_all的示例,可以依照案例测试其他参数。

$siteInfo = "编程网站,福星之吧,编程之吧网址:<a href= 'fxzbcn.com' title='学习编程' alt='学习编程网址链接'>fxzbcn.com</a><a href='fxzbcn.com' title='学习编程网站'>欢迎到编程之吧学习编程!</a>";

$list = array(); //这里存放结果

$result_a = preg_match_all ("/<a(.*)>(.*)<\/a>/U", $siteInfo, $array); // 匹配出所有的a标签

var_dump($array);

array(3) {
  [0]=>
  array(2) {
    [0]=>
    string(88) "<a href= 'fxzbcn.com' title='学习编程' alt='学习编程网址链接'>fxzbcn.com</a>"
    [1]=>
    string(88) "<a href='fxzbcn.com' title='学习编程网站'>欢迎到编程之吧学习编程!</a>"
  }
  [1]=>
  array(2) {
    [0]=>
    string(71) " href= 'fxzbcn.com' title='学习编程' alt='学习编程网址链接'"
    [1]=>
    string(45) " href='fxzbcn.com' title='学习编程网站'"
  }
  [2]=>
  array(2) {
    [0]=>
    string(10) "fxzbcn.com"
    [1]=>
    string(36) "欢迎到编程之吧学习编程!"
  }
}

for($i=0; $i<$result_a; $i++) { //对所有的a标签进行取属性
    $result_a_attr = preg_match_all('/(\w+)\s*=\s*(?:(?:(["\'])(.*?)(?=\2))|([^\/\s]*))/', $array[0][$i], $arr); //匹配出所有的属性

    var_dump($array);
    array(5) {
      [0]=>
      array(3) {
        [0]=>
        string(17) "href= 'fxzbcn.com"
        [1]=>
        string(19) "title='学习编程"
        [2]=>
        string(29) "alt='学习编程网址链接"
      }
      [1]=>
      array(3) {
        [0]=>
        string(4) "href"
        [1]=>
        string(5) "title"
        [2]=>
        string(3) "alt"
      }
      [2]=>
      array(3) {
        [0]=>
        string(1) "'"
        [1]=>
        string(1) "'"
        [2]=>
        string(1) "'"
      }
      [3]=>
      array(3) {
        [0]=>
        string(10) "fxzbcn.com"
        [1]=>
        string(12) "学习编程"
        [2]=>
        string(24) "学习编程网址链接"
      }
      [4]=>
      array(3) {
        [0]=>
        string(0) ""
        [1]=>
        string(0) ""
        [2]=>
        string(0) ""
      }
    }


    for($j=0; $j<$result_a_attr; $j++) { //将匹配完的结果进行结构重组
        $list[$i][$arr[1][$j]] = !empty($arr[4][$j]) ? $arr[4][$j] : $arr[3][$j];
    }
}

var_dump($list);

array(2) {
  [0]=>
  array(3) {
    ["href"]=>
    string(10) "fxzbcn.com"
    ["title"]=>
    string(12) "学习编程"
    ["alt"]=>
    string(24) "学习编程网址链接"
  }
  [1]=>
  array(2) {
    ["href"]=>
    string(10) "fxzbcn.com"
    ["title"]=>
    string(18) "学习编程网站"
  }
}

转载注明:

0 条评论

还没有人发表评论

发表评论 取消回复

记住我的信息,方便下次评论
有人回复时邮件通知我