我有一个字符串,其数据如下所示:
$string = '
foo=bar
badge_name_foo=foo
bar_badge_name=bar
bar=baz
';
我想匹配所有*_badge_name
和badge_name_*
字符串。
我使用的正则表达式是这样的: preg_match_all('~(?:(\w+)_)?badge_name(?:_(\w+))?~', $string, $matches, PREG_SET_ORDER);
结果是:
Array
(
[0] => Array
(
[0] => badge_name_foo
[1] =>
[2] => foo
)
[1] => Array
(
[0] => bar_badge_name
[1] => bar
)
)
的*_badge_name
工作正常,但是badge_name_*
每次都有一个空值吗?现在我该如何删除preg_match_all
预期结果应为:
Array
(
[0] => Array
(
[0] => badge_name_foo
[1] => foo
)
[1] => Array
(
[0] => bar_badge_name
[1] => bar
)
)
看来您需要使用分支重设功能:
分支重置组内的替代方案共享相同的捕获组。语法是
(?|regex)
哪里(?|
打开组,regex
是任何正则表达式。如果您不使用任何替代或捕获分支重置组内的组,则其特殊功能将不起作用。然后,它作为一个非捕获组。
使用
(?|(\w+)_badge_name|badge_name_(\w+))
^^^
请参阅regex演示。
$re = '/(?|(\w+)_badge_name|badge_name_(\w+))/';
$str = 'foo=bar
badge_name_foo=foo
bar_badge_name=bar
bar=baz';
preg_match_all($re, $str, $matches);
print_r($matches);
结果:
Array
(
[0] => Array
(
[0] => badge_name_foo
[1] => bar_badge_name
)
[1] => Array
(
[0] => foo
[1] => bar
)
)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句