За последние 24 часа нас посетил 26641 программист и 1511 роботов. Сейчас ищут 940 программистов ...

Подстановка в рег. выражении $1 как индекс массива

Тема в разделе "PHP для новичков", создана пользователем brainiac, 17 апр 2011.

  1. brainiac

    brainiac Активный пользователь

    С нами с:
    5 янв 2011
    Сообщения:
    33
    Симпатии:
    0
    Адрес:
    Новосибирск
    Я не могу это объяснить...в общем есть такое:

    PHP:
    1.  
    2. $replacement = "<div class=\"box\" name=\"\$1\" id=\"\$1\"><h3>\$2</h3>$box[\$1]";
    3. $genfaq = preg_replace("/\[!([a-z0-9_]+)!([a-z0-9_]+)!/Usi",$replacement,$struct);
    4.  
    мне нужно чтобы результат поиска ($1) подставился в массив $box как индекс и вся эта халабуда $box[\$1] возвратила значение это массива...такое вообще реальность ? )
     
  2. Gromo

    Gromo Активный пользователь

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    тогда приведи примеры как нужно сделать
     
  3. brainiac

    brainiac Активный пользователь

    С нами с:
    5 янв 2011
    Сообщения:
    33
    Симпатии:
    0
    Адрес:
    Новосибирск
    Есть массив $box (ассоциативный).
    PHP:
    1. $box = array('key1'=>'val1','key2'=>'val2');
    Есть строка $string.
    PHP:
    1. $string = 'текст key1 текст';
    Строка $string преобразуется по регулярному выражению
    PHP:
    1. $string = preg_replace("/(key\d)/","текст".$box["$1"],$string);
    На выходе должно получиться "текст текст val1 текст".
    Соответственно такая подстановка $box["$1"] не работает...как записать правильно? Т.е. в регулярном выражений мы нашли $1 и подставили как индекс массива вытащив из него значение. Вот такая задача...
     
  4. brainiac

    brainiac Активный пользователь

    С нами с:
    5 янв 2011
    Сообщения:
    33
    Симпатии:
    0
    Адрес:
    Новосибирск
    Решил сделать так:
    вытаскиваем из строки все "ключи":
    PHP:
    1. preg_match_all("/(key\d)/Usi",$string,$preg,PREG_PATTERN_ORDER);
    Потом проходим циклом с limit 1 на preg_replace
    PHP:
    1. for($i=0; $i<count($preg[0]); $i++) {
    2. $string = preg_replace("/(key\d)/Usi","текст".$box[$preg[1][$i]],$string,1);
    3. }
    Но эта штука не срабатывает...просто ничего не заменяет, думаю при limit=1 он не смещает положение на конец заменённого....как решить эту проблему?
     
  5. titch

    titch Активный пользователь

    С нами с:
    18 дек 2010
    Сообщения:
    847
    Симпатии:
    0
    PHP:
    1.  
    2. $replacement = '<div class="box" name="\1" id="\1"><h3>\2</h3>$box[\1]';
    3. $genfaq = preg_replace("/\[!([a-z0-9_]+)!([a-z0-9_]+)!/Usi",$replacement,$struct);
    4.  
    проверь-ка)
     
  6. brainiac

    brainiac Активный пользователь

    С нами с:
    5 янв 2011
    Сообщения:
    33
    Симпатии:
    0
    Адрес:
    Новосибирск
    В $box[\1] подставляется индекс правильно, но выводится не значение массива а собственно так: "$box[index]"
     
  7. brainiac

    brainiac Активный пользователь

    С нами с:
    5 янв 2011
    Сообщения:
    33
    Симпатии:
    0
    Адрес:
    Новосибирск
    Ладно...зайдем на вопрос по другому, нужно спарсить вот такую структуру:
    Это ещё ладно...заменить всё html тегами не проблема...помимо этого нужно в каждый блок (StartWork,About, Interface и т.д.) поместить информацию содержащуюся в массиве $box, ключи соответственно для него StartWork,About, Interface и т.д.

    Вот такие дела...если ещё глобальнее посмотреть - то у меня 2 файла txt, 1 - структура, 2 - информация, во-втором ситуация такая:
    Думаю тут тоже понятно...парсер этого я сделал и результаты помещаю в $box под ключами part.

    Если ВООБЩЕ глобально и не копая никуда - то я пишу FAQ ) чтобы модеры и админы могли быстро изменять структуру и содержимое фака...вот

    Какие будут предложения по этому поводу?
     
  8. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    1)preg_replace_callback.
    2)
    Т.е. второй 'BasicTerm' затирает первый?
     
  9. brainiac

    brainiac Активный пользователь

    С нами с:
    5 янв 2011
    Сообщения:
    33
    Симпатии:
    0
    Адрес:
    Новосибирск
    Спасибо, попробую с preg_replace_callback.

    Нет, он добавляется к предыдущему .=

    Вот так оно обрабатывается:
    PHP:
    1.  
    2. preg_match_all("/\[!part=([a-z0-9_]+);\s+\{(.*)\}(.*)\]/Usi",$faqstr,$matches,PREG_PATTERN_ORDER);
    3. $box = array();
    4. for ($i=0; $i<count($matches[0]); $i++) {
    5.     if (!isset($box[$matches[1][$i]])) { $box[$matches[1][$i]] = ''; }
    6.     $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>'; //наполняем категории 
    7. }
    8.  
    И в результате выходит ассоциативный массив $box с содержимым всех блоков
     
  10. brainiac

    brainiac Активный пользователь

    С нами с:
    5 янв 2011
    Сообщения:
    33
    Симпатии:
    0
    Адрес:
    Новосибирск
    Ура ! Заработало, спасибо за callback ))
    Финальный компактный вариант обработки структуры:
    PHP:
    1.  
    2. function replaceOpenBox($match) {
    3.     global $box;
    4.     return '<div class="box" name="'.$match[1].'" id="'.$match[1].'" ><h3>'.$match[2].'</h3>'.$box[$match[1]];
    5. }
    6. $genfaq = preg_replace_callback("/\[!([a-z0-9_]+)!(.+)!/Usi","replaceOpenBox",$struct);
    7. $genfaq = preg_replace("/!\]/Usi","</div>",$genfaq);
    8.