Умная замена текста

tolst

Новичок
Умная замена текста

Есть текст вида:
-----------------------
бла бла бла бла %Test% бла бла
бла %Test% бла бла бла %Test%
бла бла бла
-----------------------
И есть массив $Test[0] = "1"; $Test[1] = "2"; $Test[2] = "3";
Как мне каждый %Test% заменять на последующий $Test[]

В общем заменять %Test% не сразу везде, а только один раз
 

Фанат

oncle terrible
Команда форума
это называется [m]sprintf[/m]
только вместо%Test% надо писать %s
 

tolst

Новичок
Не катит :(
так как у меня первая замена происходит перед тем как известны остальные элементы массива... тоесть известен полный текст и только один массив, после замены станет известен второй элемент массива... можно конечно переделать, лишних циклов нафигачить, только это как то не красиво будет... по идее можно через strstr вывернуться, но эт тоже не больно как то :(
 

rotoZOOM

ACM maniac
как вариант:
PHP:
// $str - сам текст
$off=0;
$res="";
$i=0;
while (($pos=strpos($str,"%Test%",$off))!==false){
     $res+=substr($str,$off,$pos-$off)+$Test[$i++];
     // далее вычисляем следующий $Test[i]
     $off+=6;
}
// в итоге $res - результирующая строка
 

tolst

Новичок
Твой вариант помоему не работает... может просто я туплю чёто :)
 

tolst

Новичок
не работает :(
как я понял смысл твоей фишки в том, чтобы узнать при помощи strpos координаты первого вхождения, потом при помощи substr вырезать от туда %Test% и вставить теда нужное... прально?
 

rotoZOOM

ACM maniac
tolst нет не правильно. Узнать с помощью strpos идекс ТЕКУЩЕГО вхождения %Test% в текст, потом с помощью substr вырезать все от предыдущего вхождения до текущего и после добавить значение из массива $Test, все это повторять, пока не кончится строка ... да и в конце надо бы добавить:
$res+=substr($str,$off,-1);
 

specialist

Guest
возможно и не лучший вариант....
PHP:
$str = 'бла бла бла бла %Test% бла бла
бла %Test% бла бла бла %Test%
бла бла бла';

$pattern = '/%Test%/i';
$replacement[] = '1';
$replacement[] = '2';
$replacement[] = '3';

foreach ($replacement as $k => $v) {
	$str = preg_replace($pattern, $v, $str,1);
}
 

Sherman

Mephi
Вот еще вариант:

Код:
$counter = 0;
$string = "Тевтовая строка, здесь будет первый тег %test%, а тут будет второй %test%, ну а тут пусть будет третий тег %test%.";
	
	function replacer($testArray)
	{
		global $counter, $array;
		$testArray[0] = $array[$counter];
		$counter++;
		return $testArray[0];
		
	}
	
	echo preg_replace_callback(
             "/%test%/",
             "Replacer",
             $string);
 

tolst

Новичок
У тебя видиш, опать нужно знать все значения заменяемого сразу....

rotoZOOM
Пасиба за помощь... немнога не подходит вариант :(

В общем щас пытаюсь написать функцию которая единожды заменяет %Test% на какой то текст, а не все сразу...
function ReplceOne($in, $out, $content){
// То что будет тут можите предлогать...

}
//$in - что заменять
//$out - на что
//$content - в каком тексте...
 

rotoZOOM

ACM maniac
PHP:
if (($pos=strpos($content,$in,0))!==false){ 
     return substr($content,0,$pos)+$out+substr($content,$pos+strlen($in),-1); 
}
return $content;
 

tolst

Новичок
PHP:
function ReplceOne($in, $out, $content){
	if ($pos = strpos($content, $in)){
		$start = substr($content, 0, $pos);
		$end = substr($content, $pos+strlen($in));
	}
	return $start . $out . $end;;
}
Это мой вариант... какой лучше? :)

-~{}~ 17.06.05 12:25:

Одинаково мыслим практически :)
 

Sherman

Mephi
Лучше навреное тот, который быстрее, проведи серию экспериментов и поймешь:)
 

rotoZOOM

ACM maniac
У тебя тоже самое, только другими словами и не забывай, что если в $content не обнаружится $in, то у тебя вернется $out.
 

specialist

Guest
0.00031900000000001 для моего варианта + компактность кода
З.Ы. правда учитывая размеры входящих данных....:D
 

tolst

Новичок
Да, я в курсе... :)

-~{}~ 17.06.05 12:30:

specialist
твой вариант не подходит, так как нужно знать все значения перед тем как заменять... если мне переделывать скрипт именно под эти условия то будет тормознее с твоим вариантом чем с этими
 
Сверху