2016-12-13 96 views
0

我有這個字符串:PHP:取決於正則表達式組值取決於行?

[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

嘗試['preg_replace('〜^ \ [\?{3}(?=]。*?\ R \ [0)〜sm','[0 ??',$ s)']( https://regex101.com/r/eV5GRr/1) –

+0

哇,謝謝。不知道它做什麼壽:D – Martin

+0

適用於0XX,但它不看行之間。例如。這裏https://regex101.com/r/VII7hy/1我想匹配'[100]'和'[115]' – Martin

回答

0

您可以使用基於一個\G運營商定製的邊界:

(?sm)(?:^\[0\d{2}]|\G(?!\A)).*?\R\[\K\?{3}(?=.*?\R\[0) 

regex demo

變化0^\[0\R\[0與您需要的值。

詳細

  • (?sm) - DOTALL和多模式上
  • (?:^\[0\d{2}]|\G(?!\A)) - 匹配任一2:
    • ^\[0\d{2}] - 行,[0的開始,和2位
    • \G(?!\A) - 上一次成功比賽結束
  • .*?\R\[ - 任何0+字符儘可能少的,到第一線斷裂,然後換行(\R)和文字[
  • \K - 忽略從比賽緩衝至今匹配的所有文字
  • \?{3} - 3 ?符號
  • (?=.*?\R\[0) - 和需要換行符的存在,接着與任何0+字符後[0,儘可能少。