Замена слов или символов в строке

Кощей

if(!$needle) die("ooh");
Замена слов или символов в строке

Есть строка, какой-то длины есть список чего заменять и список на что заменять, проблемма в том что список чего заменять может пересекаться с тем что заменяем,
Типа строка
heFdsom

замена

he -> df
ds -> om
om -> 123

должно выйти:
dfFom123
а не
dfF123123
 

HraKK

Мудак
Команда форума
а если

qwerty
qw => 11
we => 22
что должно выйти?
11erty
или
q22erty?
 

Кощей

if(!$needle) die("ooh");
Первое 11erty

-~{}~ 25.02.08 23:09:

простым preg_match пройтись невыйдет, я вот непонимаю как с минимальными затратами это заменить всё
 

berkut

Новичок
Sluggard извините, но завтра. ибо сейчас никак прочитать первый пост не могу
 

Кощей

if(!$needle) die("ooh");
Вот я сейчас определил все номера букв где что начинаеться и что где заканчиваеться и на что стоит заменить но ошибка с заменой где-то в цикле, подскажете ?
 

berkut

Новичок
чорт, я имел ввиду strtr(). но оно всё-равно не работает. и я так чую, одной функцией не обойдёшся. только писать изврат-заменялку
 

HraKK

Мудак
Команда форума
Наш индусский ответ:
PHP:
<?php
function replaceStr($needle, $haystack)
{
	if(count($needle>1))
	{
		foreach ($needle as $before=>$after)
		{
			$haystack_array = explode($before,$haystack);
			foreach ($haystack_array as &$haystack_item)
			{
				$tmpneedle = $needle;
				unset($tmpneedle[$before]);
				$haystack_item = replaceStr($tmpneedle,$haystack_item);
			}
			$haystack = implode($after,$haystack_array);
			break;
		}		
	}
	else
	{
		foreach ($needle as $before=>$after)
		{
			$haystack = str_replace($before,$after,$haystack);
		}
	}
	return $haystack;
}
print replaceStr(array('qw'=>'11','11'=>'qw','yu'=>'cc','cc'=>'22'),'qwertyuiqwetr');
?>
 

Кощей

if(!$needle) die("ooh");
Автор оригинала: HraKK
Пиздец, вот это ты гений:) Cпасибо
Я вот такой бред писал:
PHP:
<?php
/* Строка, произвольная */
$string = "AABBBCCDEEEEFFZY";

/* Для наглядности покажем номера символов*/
$arr1 = str_split($string);
foreach($arr1 as $key => $value){
$lets .= "<td> $value </td>";
$nums .= "<td><small>$key</small></td>";
}
echo "<table><tr>$lets</tr><tr>$nums</tr></table>";



/* Таким будем заменять */
$rep['AA']='ABCDE';
$rep['BBB']='X';
$rep['D']='FF';
$rep['FF']='1234';



/* Масив который покажет на каком порядковом номере в строке начинаеться
   то или иное искомое   выражение, из масива замен */
foreach($rep as $find => $val){

$vhodov = substr_count($string, $find);
    $i=0;
    /* узнаём длину выражения которым заменим участок */
    $find_len = strlen($find);
    //Копируем еккземпляр строки для обработки первой заменой
    $str = $string;
	for($i=0;$i<$vhodov;$i++){

      /* вхождение, номер позиции относительно нашего екземпляра строки*/
	  $pos   = strpos($str, $find);
	  /* обрезаем обработаную часть строки */
	  $str   = substr($str, $pos + $find_len);

      /* позиция вхождения, относительно оригинала строки */
      $start = $pos+$stop;
	  $stop = $start + $find_len;
      /* создаём масив позиция для старта и идентификатор заменителя */
	  $where['start']=$start;
	  $where['stop']=$stop;
	  $where['f']=$find;
	  /* и заносим в главный масив для фиксации вхождений */
	  $wp[]=$where;

	}

	unset($plus_pos);
	unset($pos);
	unset($i);
	unset($start);
	unset($stop);
}
/* сортируем масив по первому значению (старт) это очень важно
для последующего прохождения с заменами по строке*/
sort($wp);
//echo '<pre>';
//print_r($wp);
$str = $string;
$plus=0;


  echo '<br><br>';


/* Цикл для обхода строки и замены */
foreach($wp as $zamena){

/* Узнаём что изменяем */
$find = $zamena['f'];
/* Узнаём на что изменяем */
$what = $rep[$find];

$what_lenth=strlen($what);
$find_lenth=strlen($find);


/* где будем начинать записывать замену */
$start = $zamena['start'];
/* до скольки замена будет заменять */
$stop = $start + $zamena_lenth;


$start +=$plus;
$stop  +=$plus;

$raznitsa = $what_lenth-$find_lenth;
echo "Длина выражения [$what] $what_lenth, разница с длиной участка $raznitsa";

$plus += $raznitsa;

echo " итог -> $plus<br>Стартуем с $start на $what_lenth сейчас строка: $str<hr>";



$str = substr_replace($str, $what, $start, $what_lenth);


}

echo $str;
?>
-~{}~ 26.02.08 01:41:

Можно теперь убрать тему ?

-~{}~ 26.02.08 02:23:

Можеш сказать что я вконце сделал нетак пожалуйста.
 

Sluggard

Новичок
berkut
Ой какие мы обидчивые :)
PHP:
$tr = array('qw' => '11', 'we' => '22');
echo strtr('qwerty', $tr);
 

berkut

Новичок
пиля...
string strtr ( string str, string from, string to )
string strtr ( string str, array replace_pairs )
как так можно... ыы)) как всё просто.
 

berkut

Новичок
и примера нет. я вспомнил, что там две строки в качестве параметров - подумал, еслиб 1 символ на 1 заменять, а тут вон как. а оказываецо есть ещё и strtr(string str, array replace_pairs)
 
Сверху