Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Удаление повторов из строки


Автор: PROme 18.11.2005, 18:45
даже не знаю, может регами как-то можно?
в общем задача: удалить из строки повторы слов, идущих продляд, т.е. строку вида:

слово1 слово2 слово3 слово3 слово1 слово1 слово2 слово3

нужно привести к виду

слово1 слово2 слово3 слово1 слово2 слово3 - чтобы небыло повторос среди соседних слов

первое, что приходит на ум - разбиваем строку на слова и сравниваем поочередно соседние, если следующее слово = текущему, значит удаляем его, если нет, передвигаемся на слово впиред и так до конца строки

а поизящнее способа нет smile

Автор: Mal Hack 18.11.2005, 21:53
Попробуй так:
Код

<?php

$str = preg_replace( "#(?:(слово2(\s|$)))+#isS" , "\\2" , $str );

?>

Автор: PROme 20.11.2005, 16:04
Mal Hack
немного не так понял
сами слова нам неизвестны

Автор: Mal Hack 20.11.2005, 16:10
Разделяешь слова по пробелам, делаешь array_unique, затем join через | и подставляешь на место "слово2"

Автор: PROme 20.11.2005, 19:07
Mal Hack
ну спасибо smile
тока по-моему, это далеко не более простой и легкий для машины способ
если будут еще идеи, пишите, пока поюзаю простенький свой...

Автор: Mal Hack 20.11.2005, 20:48
Код
<?php

print $str = "слово1 слово2 слово3 слово3 слово1 слово1 слово2 слово3";

print "<br>";

$a = explode( " " , $str );
$i = 1;
while( $i < count( $a ) )
 {
  if( $a[ $i ] === $a[ $i - 1 ] ) 
   {  unset( $a[ $i ] );  }
  else
   {  $i++;  }
 }
$str = join( ' ' , $a );

print $str;

?>

Автор: PROme 21.11.2005, 21:31
ага, пасибки
с реализацией какраз тут проблем не возникает, а вот алгоритм, ну ладно, не буду заморачиваться, и так сойдет

кстати, если кто будет юзать, лучше так:

Код

<?php

print $str = "слово1 слово2 слово3 слово3 слово1 слово1 слово2 слово3";

print "<br>";

$a = explode( " " , $str );
$i = 0;
while( $i < count( $a ) )
 {
  if( $a[ $i ] === $a[ $i + 1 ] ) 
   {  unset( $a[ $i ] );  }
  else
   {  $i++;  }
 }
$str = join( ' ' , $a );

print $str;

?>


иначе

Код

print $str = "слово1 слово2 слово3 слово3 слово3 слово1 слово1 слово2 слово3";


обработается не до конца
я же нигде не писал, что слов подряд может быть только два ;)

Автор: -=Ustas=- 22.11.2005, 10:37
А почему бы не заюзать array_unique() ?

Автор: -=Ustas=- 22.11.2005, 10:47
По-моему лучше так уже:
Код

<?php

$a = array();
$b = array();
$str = "слово1 слово2 слово3 слово3 слово1 слово1 слово2 слово3";

$a = explode(" ", $str);
$b = array_unique($a);
$str = join(' ', $b);

echo $str;

?>

Автор: Mal Hack 22.11.2005, 10:53
-=Ustas=- надо не все повторы удалить, а только те, которые идут подряд.

Автор: -=Ustas=- 22.11.2005, 12:13
Цитата(PROme @ 18.11.2005, 18:45)
в общем задача: удалить из строки повторы слов, идущих продляд, т.е. строку вида:

smile Сорьки, не заметил... Ну тогда только в цикле пробегаться, я пока другого решения, более элегантного, не вижу.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)