2012-03-18 2 views
2

Проблемы у меня есть мне нужно заменить несколько переменных в строках с данными, например:str_replace и номер

Blah blah S_10 blah S_1 blah blah S_5 blah blah S_15 

Таким образом, проблема, когда я перебирать все строки, то S_1 замена нежелательная может заменить первый 3 символ S_10 и S_15, так что строка будет выглядеть

Blah blah APPLE0 blah APPLE blah blah ORANGE blah blah APPLE5 

Что лучший способ подойти к этой проблеме?

+0

Это зависит от того, как выполнить замену .. Можете ли вы p ost код? – digEmAll

ответ

0

Возможно, это не лучшее решение, но с учетом представленной информации. Возможно, вы можете использовать метод замены строк (str_replace) с использованием порядка S_15, S_10, S_5, за которым следует S_1. Таким образом, вы не получите этого конфликта.

2

Вот совет, который вы всегда можете использовать arrange the search keys by length/value in descending order

str_replace(array('S_15', 'S_10', 'S_1'), array('your replacements'), $string); 
+0

Это не удается, если замена содержит следующий термин поиска, как в 'str_replace (array ('S_15', 'S_10'), массив ('S_10', 'foo'), 'S_15')'. – Gumbo

+0

@Gumbo Согласитесь, но большую часть времени вы не заменяете ключи поиска заменой, которая содержит те же ключи поиска. – Rezigned

-1

с пропитанного связующим заменить:

?php 
$a = "Blah blah S_10 blah S_1 blah blah S_5 blah blah S_15"; 
$search = array("/S_1([0-9]+|)/", "/S_5([0-9]+|)/"); 
$replace = array('APPLE', 'ORANGE'); 

$a = preg_replace($search, $replace, $a); 

echo $a; 
?> 
+0

Этот код превращает 'S_15' в' APPLE5', чего хочет избежать OP. – digEmAll

+0

исправлено исправлено – ZiTAL

3

Вместо замены одного термина в то время, найти все термины и сразу заменить их. Вы можете использовать preg_replace_callback выполнить поиск по регулярному выражению и вызвать функцию для каждого матча, чтобы заменить его с соответствующей заменой:

$mapping = array('S_1' => 'APPLE', 'S_2' => 'ORANGE'); 
$output = preg_replace_callback('/S_\d+/', function ($match) use ($mapping) { 
    return array_key_exists($match[0], $mapping) ? $mapping[$match[0]] : $match[0]; 
}, $input); 
0

Вы можете пройти через бурильную ищет «S_», когда вы найдете его, вы определить число, и заменить его на соответствующий пункт, так:

<?php 
$text = "Blah blah S_10 blah S_1 blah blah S_5 blah blah S_15"; 
for($i=0;$i<strlen($text);$i++){ 
if($text[$i] == "S" and $text[$i+1] == "_"){ 
    $j = $i+2; 
    while($text[$j] != " "){$j++;} 
    $value = substr($text, $i,$j-1); 
    $text = substr($text, 0, $i-1)+replace($value)+substr($text, $j); 
    } 
    } 
?> 

и функции замены, замены S_ * тем, что вы хотите