Скажем, у меня есть функция templateMap
, которая для каждого подмассива $array
, заменяет каждое вхождение @n
(для некоторого n
) в данной $string
со значениями из этой подрешетки, возвращая новый массив подмассивов. Также скажите, что я хочу разрешить пользователю обратную косую черту символ @
(что означает, что можно также вернуть обратно \
).Анализировать обратной косой черты побег с str_replace
Например:
function templateMap ($string, $array) {
$newArray = array();
foreach($array as $subArray) {
foreach($subArray as $replacements) {
...
}
}
return $newArray;
}
// for grouping mysql statements with parentheses
templateMap("(@)", array(" col1 < 5 && col2 > 6 ", " col3 < 3 || col4 > 7"));
Это производят бы
array("(col1 < 5 && col2 > 6)", "(col3 < 3 || col4 > 7)")
Вот более сложный пример с несколькими аргументами - вероятно, не легко осуществить
templateMap("You can tweet @0 \@2 @1", array(
array("Sarah", "ssarahtweetzz"),
array("John", "jjohnsthetweetiest"),
...
));
/* output:
array(
"You can tweet Sarah @2 ssarahtweetzz",
"You can tweet John @2 jjohnsthetweetiest"
)
*/
Есть ли способ выполнить это с помощью серии str_replace
звонков? (В отличии от с регулярным выражением или простым автоматом.)
Одна вещи, которую я думал о том, чтобы заменить вхождения \@
экзотической строки не найден в текущей строке, например zzzzzz
, но, конечно же, то вам нужно проверить, находится ли строка в данной строке и соответствующим образом изменить ее.
Я не знаю, является ли это проблемой для OP, но это решение не позволило бы сохранить двойные знаки процента. Для '$ arr = templateMap (" (@ \ @) ", array (" hel %% o ")),' он будет производить '(hel% o @)' вместо '(hel %% o @)' – mhall
@mhall, 1) спасибо за ваш вклад выше, мне будет интересно его прочитать, 2) (я OP), 3) хороший улов - я изменил код, разделив на "@", а затем декодирование перед заменой. –