如果你有字符串
'Old string Old more string Old some more string'
你想得到
'New1 string New2 more string New3 some more string'
你会怎么做?
换句话说,你需要用变量字符串'New'替换'Old'的所有实例。$ i。有什么建议吗?
答案 0 :(得分:6)
迭代解决方案,不需要正则表达式
$str = 'Old string Old more string Old some more string';
$old = 'Old';
$new = 'New';
$i = 1;
$tmpOldStrLength = strlen($old);
while (($offset = strpos($str, $old, $offset)) !== false) {
$str = substr_replace($str, $new . ($i++), $offset, $tmpOldStrLength);
}
$offset
中的 strpos()
只是一点微优化。我不知道,它是否值得(事实上我甚至不知道,如果它改变了什么),但我们的想法是,我们不需要在子串中搜索$old
,已经处理完毕。
请参阅Demo
Old string Old more string Old some more string
New1 string New2 more string New3 some more string
答案 1 :(得分:2)
$count = 0;
$str = preg_replace_callback(
'~Old~',
create_function('$matches', 'return "New".$count++;'),
$str
);
答案 2 :(得分:1)
来自str_replace
上的PHP手册:
用替换字符串
替换所有出现的搜索字符串mixed str_replace ( mixed $search , mixed $replace , mixed $subject [, int &$count ] )
搜索
正在搜索的值,也称为 针 。阵列可用于指定多个针。
替换
替换找到的搜索值的替换值。可以使用数组来指定多个替换。
受试者
正在搜索和替换的字符串或数组,也称为 haystack 。
如果 subject 是一个数组,则对 subject 的每个条目执行搜索和替换,并且返回值也是一个数组。
计数的
如果通过,则将设置为执行的替换次数。
答案 3 :(得分:1)
怎么样:
$str = 'Old string Old more string Old some more string';
$i = 1;
while (preg_match('/Old/', $str)) {
$str = preg_replace('/Old/', 'New'.$i++, $str, 1);
}
echo $str,"\n";
<强>输出:强>
New1 string New2 more string New3 some more string
答案 4 :(得分:1)
我有一些像KingCrunch这样的类似解决方案,但是他已经回答了这个问题,我想知道一个str_replace
变体带有一个替换回调并想出了这个(Demo):
$subject = array('OldOldOld', 'Old string Old more string Old some more string');
$search = array('Old', 'string');
$replace = array(
function($found, $count) {return 'New'.$count;},
function($found, $count) {static $c=0; return 'String'.(++$c);}
);
$replace = array();
print_r(str_ureplace($search, $replace, $subject));
/**
* str_ureplace
*
* str_replace like function with callback
*
* @param string|array search
* @param callback|array $replace
* @param string|array $subject
* @param int $replace_count
* @return string|array subject with replaces, FALSE on error.
*/
function str_ureplace($search, $replace, $subject, &$replace_count = null) {
$replace_count = 0;
// validate input
$search = array_values((array) $search);
$searchCount = count($search);
if (!$searchCount) {
return $subject;
}
foreach($search as &$v) {
$v = (string) $v;
}
unset($v);
$replaceSingle = is_callable($replace);
$replace = $replaceSingle ? array($replace) : array_values((array) $replace);
foreach($replace as $index=>$callback) {
if (!is_callable($callback)) {
throw new Exception(sprintf('Unable to use %s (#%d) as a callback', gettype($callback), $index));
}
}
// search and replace
$subjectIsString = is_string($subject);
$subject = (array) $subject;
foreach($subject as &$haystack) {
if (!is_string($haystack)) continue;
foreach($search as $key => $needle) {
if (!$len = strlen($needle))
continue;
$replaceSingle && $key = 0;
$pos = 0;
while(false !== $pos = strpos($haystack, $needle, $pos)) {
$replaceWith = isset($replace[$key]) ? call_user_func($replace[$key], $needle, ++$replace_count) : '';
$haystack = substr_replace($haystack, $replaceWith, $pos, $len);
}
}
}
unset($haystack);
return $subjectIsString ? reset($subject) : $subject;
}