За последние 24 часа нас посетил 19761 программист и 1691 робот. Сейчас ищут 1715 программистов ...

рег.выр. для выдирания текста из <div>...</div>

Тема в разделе "Регулярные выражения", создана пользователем artur1313, 6 июн 2009.

  1. artur1313

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

    С нами с:
    26 май 2009
    Сообщения:
    34
    Симпатии:
    0
    возможно ли составить такое ругялрное выражение, чтобы оно соблюдало иерархию div'ов, например
    текст: <div> 123 <div> 345 </div> asd </div>
    чтобы из него выдиралось " 123 <div> 345 </div> asd " а не "123 <div> 345 "
    надеюсь вы меня поняли
    будет сложно, но кто сможет, помогите!
     
  2. Apple

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

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    А в чём проблема?
    Пройдитесь рекурсивно по массиву, полученному с помощью функции preg_match_all('/<div>(.+)<\/div>/i', $divs, $poc);
    Задача тривиальная и решается минут за 5 максимум.
    Ага, сложно, аж пузо надорвешь.
     
  3. artur1313

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

    С нами с:
    26 май 2009
    Сообщения:
    34
    Симпатии:
    0
    Apple, надеюсь ваше пузо цело
    в моём примере в массиве $poc окажутся 2 элемента: $poc[0][0] и $poc[1][0], равные
    "123
    345
    asd"
    а мне конечном итоге нужно (как я писал) получить "123 <div> 345 </div asd"
     
  4. Apple

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

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Это уже не ваша забота.

    Неужели так сложно прочитать то, что я УЖЕ НАПИСАЛ?
    РЕКУРСИВНО, блин, РЕКУРСИВНО!
     
  5. Тише, тише. Незачем так кричать.
     
  6. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
  7. artur1313

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

    С нами с:
    26 май 2009
    Сообщения:
    34
    Симпатии:
    0
    Apple
    с вами всё понятно
    Mr.M.I.T.
    я бы рад, но DOM как я знаю как бы в javascript'e в основном используется, мне нужно ораганизовать это средствами php. Нашел статейку про обработку xml документов с помощью dom php (http://phpclub.ru/detail/article/2003-05-12), но у меня будет html документ...
     
  8. Apple

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

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Вы слишком мало знаете (с)

    =)))
     
  9. artur1313

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

    С нами с:
    26 май 2009
    Сообщения:
    34
    Симпатии:
    0
    ну так подскажите, если не сложно, киньте ссылок по теме
     
  10. Apple

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

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    PHP:
    1. <?php
    2.  
    3. function GetContent($string, &$array)
    4. {
    5.     if(preg_match('/<div>(.+)<\/div>/is', $string, $matches))
    6.     {
    7.         $array[] = htmlspecialchars($matches[1]);
    8.        
    9.         GetContent($matches[1], $array);
    10.     }
    11.    
    12. }
    13.  
    14. $string  = '<div> 123 <div> 345 </div> asd </div>';
    15. $content = array();
    16.  
    17. GetContent($string, $content);
    18.  
    19. echo '<pre>';
    20. print_r($content);
    21.  
    22. ?>
    Можно поступить по-другому:
    Вручную считать уровни вложенности и циклом пройтись по строке, начиная с ПОСЛЕДНЕГО вхождения <div>
     
  11. artur1313

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

    С нами с:
    26 май 2009
    Сообщения:
    34
    Симпатии:
    0
    для меня главное время выполнения, чтоб не сильно загружать сервак
    что посоветуете?
     
  12. Apple

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

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Переписал предыдущий код немного.
    Разберитесь в нем.

    Полностью корректно учитывает вложенность тегов, причем сам их не захватывает и берет контент, расположенный ТОЛЬКО В ТЕКУЩЕМ теге.
    Выбирайте любой из вариантов.

    PHP:
    1. <?php
    2.  
    3. /**
    4.  * Функция получения всех вложенных элементов в div
    5.  * с учетом атрибутов.
    6.  * Не захватывает теги.
    7.  */
    8. function GetContent($string, &$array)
    9. {
    10.     // $string - HTML код с <div>
    11.     // $array  - куда будет записан результат (массив)
    12.    
    13.     if(preg_match('/<div(?:.*?)>(.+)<\/div>/is', $string, $matches))
    14.     {
    15.         $array[] = preg_replace('/(<div(?:.*?)>.+<\/div>)/is', '', $matches[1]);
    16.        
    17.         GetContent($matches[1], $array);
    18.     }
    19.    
    20. }
    21.  
    22. $string  = '<div> 123 <div> 34 <div>hello, World <div style="color: red;">Last Div</div></div>5 </div> asd </div>';
    23. $content = array();
    24.  
    25. GetContent($string, $content);
    26.  
    27. echo '<pre>';
    28. print_r($content);
    29.  
    30. ?>
    Выведет:
    Код (Text):
    1. Array
    2. (
    3.     [0] =>  123  asd
    4.     [1] =>  34 5
    5.     [2] => hello, World
    6.     [3] => Last Div
    7. )
    Довольно оптимальный вариант, нагружать ничего не будет.
    Время выполнения .. ну это же регулярные выражения =)
     
  13. artur1313

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

    С нами с:
    26 май 2009
    Сообщения:
    34
    Симпатии:
    0
    оО, спасиб
    а можете сделать так, чтобы из кадого слоя не отсеивалось содержимое других слоёв, чтобы сохранялось как есть, с самим тегами...
    например есть в документе слой <div id="div1">.... </div>
    напишите пожалуйста код выдирания текста из этого слоя
     
  14. Apple

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

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    PHP:
    1. <?php
    2.  
    3.  /**
    4.   * Функция получения всех вложенных элементов в div с учетом атрибутов.
    5.   */
    6. function GetContent($string, &$array)
    7. {
    8.     // $string - HTML код с <div>
    9.     // $array  - куда будет записан результат (массив)
    10.      
    11.     if(preg_match('/<div(?:.*?)>(.+)<\/div>/is', $string, $matches))
    12.     {
    13.         $array[] = $matches[1];
    14.         GetContent($matches[1], $array);
    15.     }
    16.      
    17. }
    18.  
    19. // Строка с HTML
    20. $string  = '<div> 123 <div> 34 <div>hello, World <div style="color: red;">Last Div</div></div>5 </div> asd </div>';
    21.  
    22. // Куда пишем результат
    23. $content = array();
    24.  
    25. // Вызываем функцию выборки
    26. GetContent($string, $content);
    27.  
    28. // Добавляем к первому элементу DIV теги
    29. //if(count($content)) $content[0] = "<div>${content[0]}</div>";
    30. // Первый элемент начинает дерево элементов.
    31.  
    32. // Превьюшка
    33. echo '<pre>';
    34. print_r($content);
    35.  
    36. ?>
    Дерет как надо =)
     
  15. artur1313

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

    С нами с:
    26 май 2009
    Сообщения:
    34
    Симпатии:
    0
    супер!
    то что надо!
    огромное спасибо!
     
  16. antonn

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

    С нами с:
    10 июн 2007
    Сообщения:
    2.996
    Симпатии:
    0
    кстати, а окромя рекурсии как можно?
    а то стек то не резиновый %)
     
  17. Apple

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

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    1. Ручной учет вложенности и последующий перебор циклом массива, с заведомо полученными позициями
    2. Подсчитать количество тегов открытых и закрытых, в случае, если не равно, выбрать наименьшее из этих чисел и пройтись регулярным выражением известное кол-во раз.
    3. С помощью while(true) делать проверку с изменением (заменой строки).

    Варантов действительно много и я уверен, что каждый придумает кучу своих.
    Третий вариант, кстати, я когда-то давно использовать для вложенных BB кодов:

    PHP:
    1. <?
    2.  
    3. while(preg_match('/\[b\].+\[\/b\]/si', $html))
    4. {
    5.     $html = preg_replace('/\[b\](.+)\[\/b\]/si', '<b>$1</b>', $html);
    6. }
     
  18. artur1313

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

    С нами с:
    26 май 2009
    Сообщения:
    34
    Симпатии:
    0
    сорри, что опять обращаюсь, но я нашел 1 косяк в коде
    если например подставить строку
    $string = '<div> 123 <div> 34 <div>hello, World <div style="color: red;">Last Div</div></div>5 </div> asd </div> <div> asjdkljsdk </div>';
    то будет работать уже неправильно
    можете это исправить