2

我想使用 preg_replace 将主题中的标记替换为值。主题中的标记是问号或命名参数。(想想 PDO 风格)

我目前的方法工作正常,直到其中一个值本身包含问号。(或命名变量。)在这种情况下,整个系统都会变坏:替换值中的问号本身会被下一个值替换。

基本上,我不想替换 $values 数组中的任何内容。所以我想停止 preg_replace 的“递归”性质。

最好的方法是什么?

孤立的例子:

<?php

// Values that will be replaced
$values = array (1, 2, 'bla bla ? bla', 'NULL', 4, 'woop woop', 'waap waap');

// Keys used for replacing
$keys = array ('/[?]/', '/[?]/', '/[?]/', '/[?]/', '/[?]/', '/:testvar1/', '/:testvar2/');

// Original text
$original = ":testvar1, ?, ?, ?, ?, ?, :testvar2";

// Actual replaced text
$actual = preg_replace ($keys, $values, $original, 1);

// Expected replaced text
$expected = "woop woop, 1, 2, bla bla ? bla, NULL, 4, waap waap";

echo '<pre>';
echo "Actual:\n";
echo $actual . "\n\n";
echo "Expected:\n";
echo $expected . "\n\n";
echo "Result:\n";

if ($actual == $expected)
{
    echo '<span style="color: green;">Success!</span>';
}
else
{
    echo '<span style="color: red;">Failure!</span>';   
}

有小费吗?:-) 谢谢!

4

2 回答 2

0

这可以通过前瞻断言来解决,如下所示:

// Keys used for replacing
$keys = array ('/\?(?=,)/', '/\?(?=,)/', '/\?(?=,)/', '/\?(?=,)/', '/\?(?=,)/');

这将使 RE 引擎匹配任何后跟逗号的问号,而不使逗号成为匹配的一部分。但是,如果您曾经有包含问号后跟逗号的替换值,您将再次遇到这种情况。

于 2013-10-19T15:18:23.300 回答
0

使用preg_replace_callback这样您就可以手动分配替换,如下所示:

$values = [1,2,'bla bla ? bla','NULL',4];
$original = "?, ?, ?, ?, ?";
$actual = preg_replace_callback("/[?]/",function($m) use (&$values) {
    return array_shift($values);
});

完毕!

于 2013-10-19T15:20:13.290 回答