скажем, у меня есть эта строка:
"my string ? other string ?"
- Я хочу заменить первое "?" с
"first param ?"
(обратите внимание на заполнитель? внутри текста)
- и второй
"second param".
ЕСЛИ я делаю preg_replace, я получаю это:
my string first param second param other string ?
^^^^^^^^^^^^^^^^^^^^^^^^ ^
WRONG NOT REPLACED
По сути, поскольку первая замена имеет также заполнитель, preg_replace
достаточно глуп, чтобы заменить этот заполнитель, вместо реального второго в конце.
Код с preg_replace
:
$search = ["?", "?"];
$params = ["first param ?", "second param"];
$query ="first text ? other text ?";
//> Marker in the query are ?, so I create the array to preg_replace
$search = array_fill(0,count($params),'/\?/');
$query = preg_replace(
$search, // a list of ?
$params, // escaped values
$query, // from query
1 // replace only 1 time
);
//output: first text first param second param other text ?
Есть ли подсказка, как избежать поиска заполнителя внутри замены?
Живой код с preg_replace
: http://sandbox.onlinephpfunctions.com/code/e705ba454d030103344bc826e0fe0bf42d5b7b90
Не работает также с str_replace
$search = ["?", "?"];
$params = ["first param ?", "second param"];
$query ="first text ? other text ?";
$query = str_replace ($search, $params, $query);
echo $query;
// output: first text first param second param other text first param second param
Живой код с str_replace:
http://sandbox.onlinephpfunctions.com/code/dc259325411ee42de759f145eac78b339f329f74
Исключенный выход
Дано:
$search = ["?", "?"];
$params = ["first param ?", "second param"];
$query ="first text ? other text ?";
Ожидаемый результат:
first text first param ? other text second param
^^^^^^^^^^^^^ ^^^^^^^^^^^^
first placeholder second placeholder
Исключенный выход с 3 параметрами
$search = ["?", "?", "?"];
$params = ["first param", "second param ?", "third param"];
$query ="first text ? other text ? other chunk ?";
Ожидаемый результат:
first text first param other text second param ? other chunk third param
^^^^^^^^^^^^^ ^^^^^^^^^^^^ ^^^^^^^^^
first placeholder second placeholder third placeholder
Мое нестандартное решение
Я придумал возможное решение, используя preg_split
, но, честно говоря, это так хакерски, должно быть что-то лучше:
$parts = preg_split('/(\?)/', $query, -1, PREG_SPLIT_DELIM_CAPTURE);
foreach($parts as $k=>&$v) {
// if is odd, then it's a placeholder
if ($k%2 == 1)
$v = $params[$k/2]; // replace placeholder with a param
}
$query = implode('',$parts);