假设我有一个字符串
这0美元是2美元1美元。不过,\ $$ 3对于一只小狗来说是很重要的。
和一系列替换
array('puppy', 'cute', 'ridiculously', '1300')
用字符串中的相应项替换字符串中的标记是最干净的方法,让我反斜杠 - 转义标记字符(在本例中为$
)?我还想用空字符串替换不匹配的标记。
答案 0 :(得分:4)
foreach ($array AS $key => $value)
{
$string = str_replace('$' . $key, $value, $string);
}
答案 1 :(得分:1)
$test_sub= 'This $0 is $2 $1. Still, \$$3 is a lot to pay for a puppy.';
$GLOBALS['replacers'] = array('puppy', 'cute', 'ridiculously', '1300');
echo preg_replace_callback('/[^\$]\$([0-9])+/',
create_function(
'$matches',
'return $matches[0][0] . $GLOBALS[\'replacers\'][$matches[1]];'
),
$test_sub
);
这是如何完成的POC。一个简单的正则表达式和一个替换回调。实际的实现方式取决于您想要用它做什么。我希望它有所帮助。
答案 2 :(得分:1)
我猜你的意思是“\ $ 3”,而不是“\ $$ 3”
preg_replace('~(?<!\\\\)\$(\d+)~e', 'isset($array[$1])?$array[$1]:""', $source);
顺便说一句,你知道sprintf也允许带编号的参数(http://php.net/manual/en/function.sprintf.php示例3)
答案 3 :(得分:1)
这是一个版本。
$replacements = array('puppy', 'cute', 'ridiculously', '1300');
$input = 'This $0 is $2 $1. Still, \$3 is a lot to pay for a puppy.';
$output = preg_replace_callback('/(?<!\\\\)\$(\d+)/', 'replace_input', $input);
echo $input . "<br>";
echo $output;
function replace_input($matches) {
global $replacements;
$index = $matches[1];
return $index < 0 || $index >= count($replacements) ? $matches[0] : $replacements[$index];
}
输出:
This $0 is $2 $1. Still, \$3 is a lot to pay for a puppy.
This puppy is ridiculously cute. Still, \$3 is a lot to pay for a puppy.
它在$之前处理反斜杠以逃避该变量。这可能是一个尴尬的语法,因为那时你需要转义反斜杠,这会使它进一步复杂化(在这种情况下不处理)。正则表达式基本上是指$后跟一个或多个数字,只要$前面没有反斜杠(使用negative lookbehind)。
它使用全局替换数组。有两种选择:
create_function()
。但我认为全球化更简单,更“全球化”,除非你有充分的理由去做一些与众不同的事情,尽管我们对这些事情一般都有厌恶。
答案 4 :(得分:0)
这个解决方案遵循了这个问题,并借用了Josh Leitzel的回答。不匹配的模式(例如$ 4,$ 5)被空字符串替换,从输入中删除它们。
$input = "This $0 is $2 $1. Still, \$$3 is a lot to pay for a puppy.";
$replacements = array('puppy','cute','ridiculously','1300');
$pattern = "/[$]{1}([0-9]{1})/";
preg_match_all($pattern, $input, $matches);
if (isset($matches[1]))
foreach ($matches[1] as $key => $value)
{
$input = str_replace("$".$value, $replacements[$value], $input);
}
echo $input;
输出:
这只小狗非常可爱。不过,1300美元对于一只小狗来说还是很重要的。