возможно ли составить такое ругялрное выражение, чтобы оно соблюдало иерархию div'ов, например текст: <div> 123 <div> 345 </div> asd </div> чтобы из него выдиралось " 123 <div> 345 </div> asd " а не "123 <div> 345 " надеюсь вы меня поняли будет сложно, но кто сможет, помогите!
А в чём проблема? Пройдитесь рекурсивно по массиву, полученному с помощью функции preg_match_all('/<div>(.+)<\/div>/i', $divs, $poc); Задача тривиальная и решается минут за 5 максимум. Ага, сложно, аж пузо надорвешь.
Apple, надеюсь ваше пузо цело в моём примере в массиве $poc окажутся 2 элемента: $poc[0][0] и $poc[1][0], равные "123 345 asd" а мне конечном итоге нужно (как я писал) получить "123 <div> 345 </div asd"
Это уже не ваша забота. Неужели так сложно прочитать то, что я УЖЕ НАПИСАЛ? РЕКУРСИВНО, блин, РЕКУРСИВНО!
Apple с вами всё понятно Mr.M.I.T. я бы рад, но DOM как я знаю как бы в javascript'e в основном используется, мне нужно ораганизовать это средствами php. Нашел статейку про обработку xml документов с помощью dom php (http://phpclub.ru/detail/article/2003-05-12), но у меня будет html документ...
PHP: <?php function GetContent($string, &$array) { if(preg_match('/<div>(.+)<\/div>/is', $string, $matches)) { $array[] = htmlspecialchars($matches[1]); GetContent($matches[1], $array); } } $string = '<div> 123 <div> 345 </div> asd </div>'; $content = array(); GetContent($string, $content); echo '<pre>'; print_r($content); ?> Можно поступить по-другому: Вручную считать уровни вложенности и циклом пройтись по строке, начиная с ПОСЛЕДНЕГО вхождения <div>
Переписал предыдущий код немного. Разберитесь в нем. Полностью корректно учитывает вложенность тегов, причем сам их не захватывает и берет контент, расположенный ТОЛЬКО В ТЕКУЩЕМ теге. Выбирайте любой из вариантов. PHP: <?php /** * Функция получения всех вложенных элементов в div * с учетом атрибутов. * Не захватывает теги. */ function GetContent($string, &$array) { // $string - HTML код с <div> // $array - куда будет записан результат (массив) if(preg_match('/<div(?:.*?)>(.+)<\/div>/is', $string, $matches)) { $array[] = preg_replace('/(<div(?:.*?)>.+<\/div>)/is', '', $matches[1]); GetContent($matches[1], $array); } } $string = '<div> 123 <div> 34 <div>hello, World <div style="color: red;">Last Div</div></div>5 </div> asd </div>'; $content = array(); GetContent($string, $content); echo '<pre>'; print_r($content); ?> Выведет: Код (Text): Array ( [0] => 123 asd [1] => 34 5 [2] => hello, World [3] => Last Div ) Довольно оптимальный вариант, нагружать ничего не будет. Время выполнения .. ну это же регулярные выражения =)
оО, спасиб а можете сделать так, чтобы из кадого слоя не отсеивалось содержимое других слоёв, чтобы сохранялось как есть, с самим тегами... например есть в документе слой <div id="div1">.... </div> напишите пожалуйста код выдирания текста из этого слоя
PHP: <?php /** * Функция получения всех вложенных элементов в div с учетом атрибутов. */ function GetContent($string, &$array) { // $string - HTML код с <div> // $array - куда будет записан результат (массив) if(preg_match('/<div(?:.*?)>(.+)<\/div>/is', $string, $matches)) { $array[] = $matches[1]; GetContent($matches[1], $array); } } // Строка с HTML $string = '<div> 123 <div> 34 <div>hello, World <div style="color: red;">Last Div</div></div>5 </div> asd </div>'; // Куда пишем результат $content = array(); // Вызываем функцию выборки GetContent($string, $content); // Добавляем к первому элементу DIV теги //if(count($content)) $content[0] = "<div>${content[0]}</div>"; // Первый элемент начинает дерево элементов. // Превьюшка echo '<pre>'; print_r($content); ?> Дерет как надо =)
1. Ручной учет вложенности и последующий перебор циклом массива, с заведомо полученными позициями 2. Подсчитать количество тегов открытых и закрытых, в случае, если не равно, выбрать наименьшее из этих чисел и пройтись регулярным выражением известное кол-во раз. 3. С помощью while(true) делать проверку с изменением (заменой строки). Варантов действительно много и я уверен, что каждый придумает кучу своих. Третий вариант, кстати, я когда-то давно использовать для вложенных BB кодов: PHP: <? while(preg_match('/\[b\].+\[\/b\]/si', $html)) { $html = preg_replace('/\[b\](.+)\[\/b\]/si', '<b>$1</b>', $html); }
сорри, что опять обращаюсь, но я нашел 1 косяк в коде если например подставить строку $string = '<div> 123 <div> 34 <div>hello, World <div style="color: red;">Last Div</div></div>5 </div> asd </div> <div> asjdkljsdk </div>'; то будет работать уже неправильно можете это исправить