preg_match_all print *all* matches

后端 未结 3 1497
情话喂你
情话喂你 2021-01-15 03:33

I need to print all matches using preg_match_all.

$search = preg_match_all($pattern, $string, $matches);

foreach ($matches as $match) {
    echo $match[0];
         


        
相关标签:
3条回答
  • 2021-01-15 03:52

    You could loop recursively. This example requires SPL and PHP 5.1+ via RecursiveArrayIterator:

    foreach( new RecursiveArrayIterator( $matches ) as $match )
        print $match;
    
    0 讨论(0)
  • 2021-01-15 03:53

    Does print_r($matches) give you what you want?

    0 讨论(0)
  • 2021-01-15 04:00

    The $match[0], $match[1], etc., items are not the individual matches, they're the "captures".

    Regardless of how many matches there are, the number of entries in $matches is constant, because it's based on what you're searching for, not the results. There's always at least one entry, plus one more for each pair of capturing parentheses in the search pattern.

    For example, if you do:

    $matches = array();
    $search = preg_match_all("/\D+(\d+)/", "a1b12c123", $matches);
    print_r($matches);
    

    Matches will have only two items, even though three matches were found. $matches[0] will be an array containing "a1", "b12" and "c123" (the entire match for each item) and $matches[1] will contain only the first capture for each item, i.e., "1", "12" and "123".

    I think what you want is something more like:

    foreach ($matches[1] as $match) {
        echo $match;
    }
    

    Which will print out the first capture expression from each matched string.

    0 讨论(0)
提交回复
热议问题