我有这个文字字符串:
[000] Foo
[???] Foo
[020] Foo
[???] Foo
[045] Foo
[???] Foo
[???] Foo
[110] Foo
[???] Foo
我需要检查每一行的[XXX]值,但它必须是智能的:
如果???
值介于0**
行>之间将其替换为0??
。
期望的结果:
[000] Foo
[0??] Foo
[020] Foo
[0??] Foo
[045] Foo
[???] Foo
[???] Foo
[110] Foo
[???] Foo
我需要preg_replace_callback()
吗?
在另一步骤中,我想将其扩展为逻辑"介于1XX和2XX之间"等等,但我可以从发布的解决方案中进行调整。
测试:
<?php
// string
$s = '[000] Foo
[???] Foo
[020] Foo
[???] Foo
[045] Foo
[???] Foo
[???] Foo
[110] Foo
[???] Foo';
// _preg_replace magic
// output
echo 'After replacement:';
echo '<pre>' . $s . '</pre>';
echo 'Desired result:';
echo '<pre>[000] Foo
[0??] Foo
[020] Foo
[0??] Foo
[045] Foo
[???] Foo
[???] Foo
[110] Foo
[???] Foo</pre>';
?>
答案 0 :(得分:0)
您可以使用基于\G
运算符的自定义边界:
(?sm)(?:^\[0\d{2}]|\G(?!\A)).*?\R\[\K\?{3}(?=.*?\R\[0)
请参阅regex demo
使用您需要的值更改0
和^\[0
中的\R\[0
。
<强>详情:
(?sm)
- DOTALL和MULTILINE模式已开启(?:^\[0\d{2}]|\G(?!\A))
- 匹配2中的任何一个:
^\[0\d{2}]
- 该行的开头,[0
和2位\G(?!\A)
- 上一次成功比赛结束.*?\R\[
- 任意0个字符尽可能少,直到第一个换行符,然后是换行符(\R
)和文字[
\K
- 省略与匹配缓冲区匹配的所有文本\?{3}
- 3 ?
个符号(?=.*?\R\[0)
- 并且要求在任何0+字符之后存在换行符后跟[0
,尽可能少。