Заменить все повторяющиеся вхождения строки для одного и того же - PullRequest
0 голосов
/ 15 мая 2018

Как заменить все повторяющиеся вхождения строки для одного и того же:

У меня есть строка вроде:

1-string-2-string-3-string-55-otherstring-66-otherstring

Мне нужно заменить на:

1-2-3-string-55-66-otherstring

Как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Вы можете использовать str_word_count, чтобы получить слова и значения array_count, чтобы подсчитать, сколько раз каждое слово встречается в строке

и заменяйте каждое слово, если число больше 1

<?php
$text = "1-string-2-string-3-string-55-otherstring-66-otherstring";

$words = str_word_count($text, 1); 

$frequency = array_count_values($words);

foreach($frequency as $item=>$count) {
$item = rtrim($item,"-");

    if($count >1){
        $text = str_replace($item,"",$text);
    }
}
echo $text;
?>
0 голосов
/ 15 мая 2018

Вы можете сделать это:

$str = '1-string-2-string-3-string-55-otherstring-66-otherstring';
print_r(implode('-', array_reverse(array_unique(array_reverse(explode('-', $str))))));

Живая демоверсия

Или используя регулярные выражения:

(\w++)-?(?=.*\b\1\b)

Разбивка:

  • (\w++) Подберите и поймайте слово
  • -? Соответствует следующему дефису, если есть
  • (?= Начало позитивного взгляда
    • .*\b\1\b Последнее захваченное слово должно повториться
  • ) Конец предвкушения

Демонстрационная версия

PHP код:

echo preg_replace('~(\w++)-?(?=.*\b\1\b)~', '', $str);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...