【发布时间】:2009-10-25 11:15:05
【问题描述】:
假设我有一个字符串
这个 $0 是 $2 $1。不过,对于一只小狗来说,\$$3 还是很多的。
还有一个替换数组
array('puppy', 'cute', 'ridiculously', '1300')
用数组中的相应项替换字符串中的标记,让我用反斜杠转义标记字符(在本例中为$),最干净的方法是什么?我还想用空字符串替换不匹配的标记。
【问题讨论】:
标签: php
假设我有一个字符串
这个 $0 是 $2 $1。不过,对于一只小狗来说,\$$3 还是很多的。
还有一个替换数组
array('puppy', 'cute', 'ridiculously', '1300')
用数组中的相应项替换字符串中的标记,让我用反斜杠转义标记字符(在本例中为$),最干净的方法是什么?我还想用空字符串替换不匹配的标记。
【问题讨论】:
标签: php
foreach ($array AS $key => $value)
{
$string = str_replace('$' . $key, $value, $string);
}
【讨论】:
$s 和不匹配的标记(将它们留在字符串中是有效的,但我宁愿删除它们)。我将更新问题以澄清。
我猜你的意思是“\$3”,而不是“\$$3”
preg_replace('~(?<!\\\\)\$(\d+)~e', 'isset($array[$1])?$array[$1]:""', $source);
顺便说一句,您知道 sprintf 也允许编号参数(http://php.net/manual/en/function.sprintf.php 示例 3)
【讨论】:
preg_replace 快速通过以从转义的 $ 中删除反斜杠。
$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。一个简单的正则表达式和一个用于替换的回调。实际的实现取决于你想要用它做什么。我希望它有所帮助。
【讨论】:
这是一个版本。
$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()。但我认为全局更简单和“全局”,除非你有充分的理由去做一些不同的事情,尽管我们通常不喜欢这些事情。
【讨论】:
此解决方案遵循问题并借鉴了 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 美元对于一只小狗来说仍然是一笔不小的数目。
【讨论】: