Я не могу это объяснить...в общем есть такое: PHP: $replacement = "<div class=\"box\" name=\"\$1\" id=\"\$1\"><h3>\$2</h3>$box[\$1]"; $genfaq = preg_replace("/\[!([a-z0-9_]+)!([a-z0-9_]+)!/Usi",$replacement,$struct); мне нужно чтобы результат поиска ($1) подставился в массив $box как индекс и вся эта халабуда $box[\$1] возвратила значение это массива...такое вообще реальность ? )
Есть массив $box (ассоциативный). PHP: $box = array('key1'=>'val1','key2'=>'val2'); Есть строка $string. PHP: $string = 'текст key1 текст'; Строка $string преобразуется по регулярному выражению PHP: $string = preg_replace("/(key\d)/","текст".$box["$1"],$string); На выходе должно получиться "текст текст val1 текст". Соответственно такая подстановка $box["$1"] не работает...как записать правильно? Т.е. в регулярном выражений мы нашли $1 и подставили как индекс массива вытащив из него значение. Вот такая задача...
Решил сделать так: вытаскиваем из строки все "ключи": PHP: preg_match_all("/(key\d)/Usi",$string,$preg,PREG_PATTERN_ORDER); Потом проходим циклом с limit 1 на preg_replace PHP: for($i=0; $i<count($preg[0]); $i++) { $string = preg_replace("/(key\d)/Usi","текст".$box[$preg[1][$i]],$string,1); } Но эта штука не срабатывает...просто ничего не заменяет, думаю при limit=1 он не смещает положение на конец заменённого....как решить эту проблему?
PHP: $replacement = '<div class="box" name="\1" id="\1"><h3>\2</h3>$box[\1]'; $genfaq = preg_replace("/\[!([a-z0-9_]+)!([a-z0-9_]+)!/Usi",$replacement,$struct); проверь-ка)
В $box[\1] подставляется индекс правильно, но выводится не значение массива а собственно так: "$box[index]"
Ладно...зайдем на вопрос по другому, нужно спарсить вот такую структуру: Это ещё ладно...заменить всё html тегами не проблема...помимо этого нужно в каждый блок (StartWork,About, Interface и т.д.) поместить информацию содержащуюся в массиве $box, ключи соответственно для него StartWork,About, Interface и т.д. Вот такие дела...если ещё глобальнее посмотреть - то у меня 2 файла txt, 1 - структура, 2 - информация, во-втором ситуация такая: Думаю тут тоже понятно...парсер этого я сделал и результаты помещаю в $box под ключами part. Если ВООБЩЕ глобально и не копая никуда - то я пишу FAQ ) чтобы модеры и админы могли быстро изменять структуру и содержимое фака...вот Какие будут предложения по этому поводу?
Спасибо, попробую с preg_replace_callback. Нет, он добавляется к предыдущему .= Вот так оно обрабатывается: PHP: preg_match_all("/\[!part=([a-z0-9_]+);\s+\{(.*)\}(.*)\]/Usi",$faqstr,$matches,PREG_PATTERN_ORDER); $box = array(); for ($i=0; $i<count($matches[0]); $i++) { if (!isset($box[$matches[1][$i]])) { $box[$matches[1][$i]] = ''; } $box[$matches[1][$i]] .= '<div class="question" name="'.$matches[1][$i].$i.'" id="'.$matches[1][$i].$i.'">'.$matches[2][$i].'</div><div class="answer">'.$matches[3][$i].'</div>'; //наполняем категории } И в результате выходит ассоциативный массив $box с содержимым всех блоков
Ура ! Заработало, спасибо за callback )) Финальный компактный вариант обработки структуры: PHP: function replaceOpenBox($match) { global $box; return '<div class="box" name="'.$match[1].'" id="'.$match[1].'" ><h3>'.$match[2].'</h3>'.$box[$match[1]]; } $genfaq = preg_replace_callback("/\[!([a-z0-9_]+)!(.+)!/Usi","replaceOpenBox",$struct); $genfaq = preg_replace("/!\]/Usi","</div>",$genfaq);