PHP:根据正则表达式组值替换行?

时间:2016-12-13 15:12:28

标签: php preg-replace preg-replace-callback

我有这个文字字符串:

[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>';

?>

1 个答案:

答案 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,尽可能少。