簡體   English   中英

使用preg_replace追加

[英]append using preg_replace

我想重命名PHP doc塊中的重復條目:

 * @property \App\Models\Invitation[] $invitations
 * @property \App\Models\Invitation[] $invitations

應該成為

 * @property \App\Models\Invitation[] $invitations
 * @property \App\Models\Invitation[] $invitations2

我已經有了識別重復項的代碼,然后遍歷要在其后附加數字的屬性名稱:

preg_replace('/\@property [^ ]* \$' . $property . '/', ..., $docBlock)

我只是在努力尋找一種方法來使用如果在替換語句中使用正則表達式找到的文本:

preg_replace('/\@property [^ ]* \$' . $property . '/', MATCHED_TEXT.$i , $docBlock

preg_replace_callback解決方案:

$docBlock = '
* @property \App\Models\Invitation[] $invitations
* @property \App\Models\Invitation[] $invitations
* @property \App\Models\Invitation[] $invitations';

$property = 'invitations';
$c = 0;  // count
$result = preg_replace_callback('/(\@property \S* \$)('. $property .')/', function ($m) use(&$c){
    return $m[1] . $m[2] . (++$c == 1? '' : $c);
}, $docBlock);

print_r($result);

輸出:

* @property \App\Models\Invitation[] $invitations
* @property \App\Models\Invitation[] $invitations2
* @property \App\Models\Invitation[] $invitations3

我想您想做的是在這段代碼中讓正則表達式( MATCHED_TEXT )捕獲所有內容:

preg_replace('/\@property [^ ]* \$' . $property . '/', MATCHED_TEXT.$i , $docBlock)

要獲得全部匹配,您可以在替換區域中使用"$0"

最終代碼

preg_replace('/\@property [^ ]* \$' . $property . '/', '$0'.$i , $docBlock)

$ 0表示與模式匹配的字符串的整個部分。 $ 1等代表子模式。
參考: 《黑暗的絕對伏擊》

沒有正則表達式的簡單版本。
我使用一個臨時數組,其鍵名與字符串行相同,值是“數字”。
然后,只需循環並將數字添加到該行即可。

$str = '@property \App\Models\Invitation[] $invitations
@property \App\Models\Invitation[] $invitations
@blogpost
@blogpost
@blogpost
@blogpost';

$arr = explode("\n", $str);

$temp = array();
Foreach($arr as &$item){
    If(isset($temp[$item])){
        $key = $item;
        $item .= $temp[$item];
        $temp[$key] = $temp[$key]+1;
    }Else{
        $temp[$item] = 2;
    }
}
Echo implode("\n",$arr);

https://3v4l.org/i1bCv

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM