jan*_*n92 2 php regex match preg-match-all
例如,我有文字
a1aabca2aa3adefa4a
Run Code Online (Sandbox Code Playgroud)
我想用abc和def 之间的正则表达式提取2和3 ,因此结果中不应包含1和4.
我试过这个
if(preg_match_all('#abc(?:a(\d)a)+def#is', file_get_contents('test.txt'), $m, PREG_SET_ORDER))
print_r($m);
Run Code Online (Sandbox Code Playgroud)
我明白了
> Array
(
[0] => Array
(
[0] => abca1aa2adef
[1] => 3
)
)
Run Code Online (Sandbox Code Playgroud)
但我想要这个
Array
(
[0] => Array
(
[0] => abca1aa2adef
[1] => 2
[2] => 3
)
)
Run Code Online (Sandbox Code Playgroud)
这可以通过一个 preg_match_all调用吗?我该怎么做?
谢谢
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];
Run Code Online (Sandbox Code Playgroud)
适用于你的例子.它假定您的字符串中只有一个实例abc和def每行.
您的尝试不起作用的原因是您的(\d)匹配数字的捕获组位于另一个重复的组中(?:a(\d)a)+.每次重复,捕获的结果都会被覆盖.这就是正则表达式的工作方式.
换句话说 - 看看比赛期间发生了什么:
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
Run Code Online (Sandbox Code Playgroud)