使用preg_replace追加

时间:2017-11-29 17:23:02

标签: php regex

我想重命名PHP doc blocks中的重复条目:

 * @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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

我想你要做的是在这段代码中获取正则表达式(MATCHED_TEXT)所捕获的所有内容:

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

要获得整场比赛,您可以在替换区域中使用"$0"

最终代码

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

$ 0 表示与模式匹配的字符串的整个部分。 $ 1 等表示子模式。   
参考:Niet the Dark Absol

答案 2 :(得分:0)

没有正则表达式的简单版本。
我使用临时名称与字符串行相同的临时数组,值为"数字"。
然后,只需循环并将数字添加到该行。

$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