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

  • Автор темы Автор темы tolst
  • Дата начала Дата начала

tolst

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

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

В общем заменять %Test% не сразу везде, а только один раз
 
это называется [m]sprintf[/m]
только вместо%Test% надо писать %s
 
Не катит :(
так как у меня первая замена происходит перед тем как известны остальные элементы массива... тоесть известен полный текст и только один массив, после замены станет известен второй элемент массива... можно конечно переделать, лишних циклов нафигачить, только это как то не красиво будет... по идее можно через strstr вывернуться, но эт тоже не больно как то :(
 
как вариант:
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 - результирующая строка
 
Твой вариант помоему не работает... может просто я туплю чёто :)
 
не работает :(
как я понял смысл твоей фишки в том, чтобы узнать при помощи strpos координаты первого вхождения, потом при помощи substr вырезать от туда %Test% и вставить теда нужное... прально?
 
tolst нет не правильно. Узнать с помощью strpos идекс ТЕКУЩЕГО вхождения %Test% в текст, потом с помощью substr вырезать все от предыдущего вхождения до текущего и после добавить значение из массива $Test, все это повторять, пока не кончится строка ... да и в конце надо бы добавить:
$res+=substr($str,$off,-1);
 
возможно и не лучший вариант....
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);
}
 
Вот еще вариант:

Код:
$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);
 
У тебя видиш, опать нужно знать все значения заменяемого сразу....

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

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

}
//$in - что заменять
//$out - на что
//$content - в каком тексте...
 
PHP:
if (($pos=strpos($content,$in,0))!==false){ 
     return substr($content,0,$pos)+$out+substr($content,$pos+strlen($in),-1); 
}
return $content;
 
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:

Одинаково мыслим практически :)
 
Лучше навреное тот, который быстрее, проведи серию экспериментов и поймешь:)
 
У тебя тоже самое, только другими словами и не забывай, что если в $content не обнаружится $in, то у тебя вернется $out.
 
0.00031900000000001 для моего варианта + компактность кода
З.Ы. правда учитывая размеры входящих данных....:D
 
Да, я в курсе... :)

-~{}~ 17.06.05 12:30:

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