从字符串中删除重复的连续词

shr*_*s d 7 php regex preg-replace

我想从字符串中删除重复的单词(仅连续的)。

$str = 'abc,def,fgh,fgh,xna,fgh,xyz,xyz,xyz,tr,tr,xna';
Run Code Online (Sandbox Code Playgroud)

我想要的输出字符串是:

abc,def,fgh,xna,fgh,xyz,tr,xna
Run Code Online (Sandbox Code Playgroud)

我可以使用以下方法在php中获得所需的结果:

$ip = explode(',', $str);
$op = [];$last = null;
for($i=0;$i<count($ip);$i++){
    if ($last == $ip[$i]) {
        continue;
    }
    $op[]=$last=$ip[$i];
}
$ip = implode(',', $op);
Run Code Online (Sandbox Code Playgroud)

但是一直在寻找正则表达式方法。到目前为止,我已经熟悉了这两个正则表达式:

$after = preg_replace('/(?:^|,)([^,]+)(?=.*,\1(?:,|$))/m', '', $str);
output : abc,def,fgh,xyz,tr,xna

$after = preg_replace('/([^,]+)(,[ ]*\1)+/m', '', $str);
output : abc,degh,fgh,xna,fgh,,,xna
Run Code Online (Sandbox Code Playgroud)

Wik*_*żew 2

你应该使用

preg_replace('~(?<![^,])([^,]+)(?:,\1)+(?![^,])~', '$1', $str)
Run Code Online (Sandbox Code Playgroud)

请参阅正则表达式演示

如果需要支持逗号和重复值之间的任何 0 个或多个空格字符,请在 之前添加\s*( 0 个或多个空格) 模式\1

细节

  • (?<![^,])- 字符串或除逗号之外的任何字符的开头
  • ([^,]+)- 第 1 组:除逗号之外的任何一个或多个字符
  • (?:,\1)+- 一个或多个逗号序列和第 1 组中的值
  • (?![^,])- 字符串结尾或逗号以外的字符。