首页 > 解决方案 > 使用正则表达式解析字符串并获得所需的输出

问题描述

我想解析这个字符串

[[delay-4]]Welcome! [[delay-2]]Do you have some questions for us?[[delay-1]] Please fill input field!

我需要得到这样的东西:

[
    [0] => '[[delay-4]]Welcome!',
    [1] => '[[delay-2]]Do you have some questions for us?',
    [2] => '[[delay-1]] Please fill input field!
];

字符串也可以是这样的(开头没有 [[delay-4]]):

Welcome! [[delay-2]]Do you have some questions for us?[[delay-1]] Please fill input field!

预期的输出应该是这样的:

    [
        [0] => 'Welcome!',
        [1] => '[[delay-2]]Do you have some questions for us?',
        [2] => '[[delay-1]] Please fill input field!
    ];

我试过这个正则表达式(https://regex101.com/r/Eqztl1/1/

(?:\[\[delay-\d+]])?([\w \\,?!.@#$%^&*()|`\]~\-='\"{}]+)

但是如果有人[在文本中只写了一个,那么我对那个正则表达式有问题,正则表达式失败,如果我包含[匹配我得到错误的结果。

谁能帮我这个?

标签: phpregexpcre

解决方案


两个更简单的操作可能是获得结果的途径:

$result = preg_replace('/\s*(\[\[delay-\d+]])/i', "\n$1", $subject);
$result = preg_split('/\r?\n/i', $result, -1, PREG_SPLIT_NO_EMPTY);

可以在这里看到运行: https ://ideone.com/Z5tZI3 和这里: https ://ideone.com/vnSNYI

这假设换行符没有特殊含义并且可以拆分。


更新:正如在下面的评论中所指出的,单次拆分是可能的。

$result = preg_split('/(?=\[\[delay-\d+]])/i', $subject, -1, PREG_SPLIT_NO_EMPTY);

但是零长度匹配和正则表达式可能存在问题,您必须对此进行自己的研究。


推荐阅读