str_replace和数字

时间:2012-03-18 10:00:49

标签: php regex

我遇到的问题是我需要用数据替换字符串中的一些变量,例如:

Blah blah S_10 blah S_1 blah blah S_5 blah blah S_15

所以问题是当我遍历所有字符串时,S_1替换不合需要地可以替换S_10S_15的前3个字符,所以字符串看起来像< / p>

Blah blah APPLE0 blah APPLE blah blah ORANGE blah blah APPLE5

应对这一挑战的最佳方式是什么?

5 个答案:

答案 0 :(得分: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);

答案 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);

答案 2 :(得分:0)

可能不是最佳解决方案,但考虑到所提供的信息。也许你可以使用S_15,S_10,S_5的顺序使用字符串替换方法(str_replace),然后是S_1。这样你就不会发生冲突。

答案 3 :(得分:0)

你可以通过字符串寻找&#39; S _&#39;当您找到它时,您可以识别该号码,并将其替换为相应的项目,所以:

<?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);
     }
  }
?>

并在函数replace中,用你想要的东西替换S_ *

答案 4 :(得分:-1)

使用preg替换:

?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;
?>