имеются именованные плейсхолдеры в строке, которые необходимо заменить значениями. плейсхолдеры могут обрамляться кавычками, или не обрамляться например, запрос [sql]SELECT * FROM tablica WHERE name='{name}' and status={status}[/sql] приходится делать подряд два запроса: $query = preg_replace_callback("#'{([^}]+)}'#sUi", array($this, 'holders_replace'), $query); $query = preg_replace_callback('#{([^}]+)}#sUi', array($this, 'holders_replace'), $query); а хотелось бы сделать одним запросом, примерно такой логики: если ДО плейсхолдера есть кавычка, то и ПОСЛЕ должна стоять кавычка. Пробовал делать через карманы "#('?){([^}]+)}\1#sUi" - не видит плейсхолдеров без кавычек.
Dima4321 это простейшее решение не работает - последняя кавычка не берётся из-за опции U. Не совсем то решение, которое я искал
Volt(220) я возвращаю данные, всегда обрамлённые кавычками. таким образом, если данные уже были обрамлены, мне нужно эти кавычки убрать.
PHP: <?php $s="SELECT * FROM tablica WHERE name='{name}' and status={status}"; preg_match_all("#{([^}]+)}#sUi", $s, $m); var_dump($m); preg_match_all("#'{([^}]+)}'#sUi", $s, $m); var_dump($m); preg_match_all("#'?{([^}]+)}'?#sUi", $s, $m); var_dump($m); preg_match_all("#('?){([^}]+)}(\\1)#sUi", $s, $m); var_dump($m); preg_match_all("#({([^}]+)})|('{([^}]+)}')#sUi", $s, $m); var_dump($m);
первый и второй уже использую - подряд друг за другом. третий не учитывает последнюю кавычку. думаю над тем, чтобы убрать опцию U и не парить людям моск четвёртый пробовал - не работает =/ последний вариант выводит в разных массивах: Код (Text): Array ( [0] => Array ( [0] => {name} [1] => '{status}' ) [1] => Array ( [0] => name [1] => ) [2] => Array ( [0] => [1] => status ) ) ладно, спасибо и на этом. более хорошего способа не нашли, значит я ещё не совсем дрова :-D
Volt(220) прав, четвёртый способ работает - то, что нужно. не обратил внимание на отличия от моего. Спасибо. рад, что нашёлся всё же тот способ, который искал. не рад тому, что я всё же дрова :-D