如何根据字符串顺序

时间:2017-05-25 10:26:57

标签: php regex preg-replace-callback

假设我们有以下数组

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

字符串如下:

$string = '

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

';

我的想法是从上到下遍历字符串并依赖正则表达式列表,找到结果并将其替换为大写的内容,其中的模式与基于匹配的事件相匹配在字符串顺序上,无论 regexList 数组是什么顺序。

所以,那是我想要的输出:

  • ABC匹配:/ abc /;
  • DEF匹配:/ def /;
  • GHI匹配:/ ghi /;

或在leats

  • ABC匹配模式:2;
  • DEF匹配:0;
  • GHI匹配:1;

这是我尝试的代码:

$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 顺序(从上到下)中获取与这些字符串匹配的偏移量或模式?谢谢。

2 个答案:

答案 0 :(得分:1)

不要使用regexp数组,使用带有替代品和捕获组的单个regexp。然后,您可以看到哪个捕获组不为空。

$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);

答案 1 :(得分:0)

@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
)