我正在尝试使用preg_replace_callback
替换句子中的单词。
"%1% and %2% went up the %3%"
应该成为
"Jack and Jill went up the hill"
我在下面给出了我的代码。
<?php
$values = array("Jack", "Jill", "hill");
$line = "%1% and %2% went up the %3%";
$line = preg_replace_callback(
'/%(.*?)%/',
create_function(
// single quotes are essential here,
// or alternative escape all $ as \$
'$matches',
'return $values[$matches[1]-1];'
),
$line
);
echo $line;
?>
我得到的是
" and went up the "
如果我给return $matches[1]-1;
,我就会
"0 and 1 went up the 2"
这是范围问题吗?如何使这个工作? 任何帮助将不胜感激。
答案 0 :(得分:2)
这确实是一个范围问题 - 由create_function
创建的匿名函数无法访问$values
。
这应该有效(&gt; = PHP 5.3.0)
<?php
$values = array("Jack", "Jill", "hill");
$line = "%1% and %2% went up the %3%";
// Define our callback here and import $values into its scope ...
$callback =
function ($matches) use ($values)
{
return $values[$matches[1]-1];
};
$line = preg_replace_callback(
'/%(.*?)%/',
$callback, // Use it here.
$line
);
echo $line;
?>
通过使用use ($values)
声明回调函数,$values
将被导入其范围,并在调用时可用。如果你想进一步谷歌,这就是'关闭'超过$值的概念:)。
希望这有帮助。