Все привет! Есть такой пример: Код (Text): $text = "test ? test ? test ?"; $l = array("/\?/","/\?/", "/\?/"); $list = array("1", "2?", "3"); $t = preg_replace($l, $list, $text,1); echo $t; В результате полечаем : test 1 test 23 test ? А хотелось бы получить: test 1 test 2? test 3 То есть после того как он заменил второй элемент который в значении содержит знак вопроса то при третьей замене он начинает поиск с начала строки и заменяет уже замененный вопрос. Можно ли как то указать что бы поиск продолжался с места последней замены? Заранее всем спасибо.
Где же гуру программирования, я просто в регах не шарю поэтому и немогу дуплей отловить как это пофиксить...
alekseyyp preg_replace() так делать не умеет. Вызов его с массивом паттернов - это то же самое, что в цикле вызвать его несколько раз. Вроде как только функция strtr() умеет делать "умную" замену, не проходя по уже обработанному тексту второй раз. Спят все... после ночных смен
как всегда велосипед PHP: <? $text = "test ? test ? test ?"; $list = array("1", "2?", "3"); $ex=explode("?",$text); $res=''; for($i=0,$c=count($ex);$i<$c;$i++) { $res.=$ex[$i].($list[$i]?$list[$i]:"?"); } ?>
Что то не так. делаю Код (Text): $text = "test ? test ? test ?"; $t = strtr($text, array("?"=>"1","?"=>"2?", "?"=> "3")); echo $t; получаю test 3 test 3 test 3 а надо бы получить test 1 test 2? test 3 а это я бы и сам сделал дак ресурсоемко. как же быть?
Хорошо, буду тестить на этом, просто данных оч много обрабатывать.. Спасибо всем кто откликнулся ! Ну если у кого появятся еще идеи пишите плс!!
а какая стоит задача? т.е. зачем и как и что за данные нужно обрабатывать? Зы. Наверника в глобальном маштабе есть другое решение
интересно, если я предложу PHP: <?php $l = array("/ \?/","/ \?/", "/ \?/"); $list = array(" 1", " 2?", " 3"); ?> т.е. заменять с пробелом, то меня заклюют?
интересный ход . но думаю может быть ситуация когда и вопрос в параметрах будет стоять с пробелом. Просто вот как получается замена с продолжением от последней замены казалось бы элементарно, и что же в пхп этого никак не предусмотрели... . Остается пока решение от Mr.M.I.T.
ууу интересный вопрос.. а вот и ответ: есть запрос к примеру "SELECT * FROM table WHERE id=?" есть класс который их выполняет и автоматом эскейпит подстановки. к примеру db::query("SELECT * FROM table WHERE id=?", array(10)); так вот эта штука и должна заменить вопросики значениями из массива параметров.
не умную а наоборот как показал результат тупую. он не заменяет сразу а делает копии, а потом последним значением все и заполняет.
нафига так делать? может проще сразу [sql]SELECT * FROM table WHERE id='10'[/sql] или [sql]SELECT * FROM table WHERE id IN ('10','11','12')[/sql]
Mr.M.I.T. http://phpfaq.ru/slashes#prepared вещь полезная. Только alekseyyp делает просто замену без учёта типов. Что убивает всю идею. в самом тупом случае PHP: <?php function EscapeQuery($query,$var,$type) { while(strpos($query,'?')){ $variable = array_shift($var); $query = preg_replace('/(\?)/',"'".((array_shift($type)=='s')?mysql_real_escape_string($variable):((int)$variable))."'",$query,1); } return $query; } $vars = array($_GET['id'],$_GET['name']); $types = array('d','s'); echo EscapeQuery("SELECT * FROM `table_name` WHERE `id`=? AND `name`=?",$vars,$types); ?>