如何根据字符串顺序获取匹配字符串的模式

How to get the pattern that matched a string based on the string order

假设我们有以下 array:

$regexList = ['/def/', '/ghi/', '/abc/'];

和下面的 字符串

$string = '

{{abc}}
{{def}}
{{ghi}}

';

思路是从上到下遍历字符串,依靠正则表达式列表,找到结果并用大写的内容替换为模式无论 regexList array 是什么顺序,都根据字符串顺序匹配出现。

所以,这就是我想要的输出:

至少

这是我正在尝试的代码:

$regexList = ['/def/', '/ghi/', '/abc/'];

$string = '

abc
def
ghi

';

$string = preg_replace_callback($regexList, function($match){
  return strtoupper($match[0]);
}, $string);

echo '<pre>';
var_dump($string);

这个输出只是:

string(15) "

ABC
DEF
GHI

"

如何获取与 $string 顺序(从上到下)中的这些字符串匹配的偏移量或模式?谢谢。

不要使用正则表达式数组,使用带有替代项和捕获组的单个正则表达式。然后可以看到哪个捕获组不为空

$regex = '/(def)|(ghi)|(abc)/';
$string = preg_replace_callback($regex, function($match) {
    for ($i = 1; $i < count($match); $i++) {
        if ($match[$i]) {
            return strtoupper($match[$i]) . " was matched by pattern " . $i-1;
        }
    }
}, $string);

@Barmar 说得对,但我要稍微修改一下:

$order = [];

$string = preg_replace_callback('/(def)|(ghi)|(abc)/', function($match) use (&$order) {
    end($match);
    $order[key($match)] = current($match);
    return strtoupper($match[0]);
}, $string);

print_r($order);

输出:

Array
(
    [3] => abc
    [1] => def
    [2] => ghi
)