开发者

regex match between 2 strings

开发者 https://www.devze.com 2023-04-04 07:50 出处:网络
For example I have the text a1aabca2aa3adefa4a I want to extract 2 and 3 with a regex between abc and def, so 1 and 4 should be not included in the result.

For example I have the text

a1aabca2aa3adefa4a

I want to extract 2 and 3 with a regex between abc and def, so 1 and 4 should be not included in the result.

I tried this

if(preg_match_all('#abc(?:a(\d)a)+def#is', file_get_contents('test.txt'), $m, PREG_SET_ORDER))
  print_r($m);

I get this

> Array
(
    [0] => Array
        (
            [0] => abca1aa2adef
            [1] => 3
        )

)

But I want this

Array
(
    [0] => Array
        (
            [0] => abca1aa2adef
            [1] => 2
      开发者_如何转开发      [2] => 3
        )

)

Is this possible with one preg_match_all call? How can I do it?

Thanks


preg_match_all(
    '/\d       # match a digit
    (?=.*def)  # only if followed by <anything> + def
    (?!.*abc)  # and not followed by <anything> + abc
    /x', 
    $subject, $result, PREG_PATTERN_ORDER);
$result = $result[0];

works on your example. It assumes that there is exactly one instance of abc and def per line in your string.

The reason why your attempt didn't work is that your capturing group (\d) that matches the digit is within another, repeated group (?:a(\d)a)+. With every repetition, the result of the capture is overwritten. This is how regular expressions work.

In other words - see what's happening during the match:

Current position    Current part of regex    Capturing group 1
--------------------------------------------------------------
a1a                 no match, advancing...   undefined
   abc              abc                      undefined
      a2a           (?:a(\d)a)               2
         a3a        (?:a(\d)a) (repeated)    3 (overwrites 2)
            def     def                      3


You ask if it is possible with a single preg_match_all.

Indeed it is. This code outputs exactly what you want.

<?php
$subject='a1aabca2aa3adefa4a';
$pattern='/abc(?:a(\d)a+(\d)a)def/m';
preg_match_all($pattern, $subject, $all_matches,PREG_OFFSET_CAPTURE | PREG_PATTERN_ORDER);
$res[0]=$all_matches[0][0][0];
$res[1]=$all_matches[1][0][0];
$res[2]=$all_matches[2][0][0];
var_dump($res);
?>

Here is the output:

array
0 => string 'abca2aa3adef' (length=12)
1 => string '2' (length=1)
2 => string '3' (length=1)
0

精彩评论

暂无评论...
验证码 换一张
取 消