[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: парсинг html тегов TAGS
atarix
Доброго времени суток.
В регулярках не силён, поэтому обращаюсь за помощью.
есть строка тегов
PHP
$buffer "<spoiler>SPOILER1</spoiler><spoiler>SPOILER2</spoiler><spoiler>SPOILER3</spoiler>";


Нужен массив вида
SQL
Array
(
[0] => SPOILER1
[1] => SPOILER2
[2] => SPOILER3
)


Нашёл сборник функций парсинга
http://www.php.ru/forum/viewtopic.php?t=19101

Оттуда взял

PHP
preg_match_all("/(<spoiler.*>)(\w.*)(<\/spoiler>)/ismU",$buffer,$content1)


по разному пробовал, в результате что то типа

PHP
[0] => Array
        (
            [
0] => SPOILER1
            
[1] => SPOILER2
            
[2] => SPOILER3
        
)

    [
1] => Array
        (
            [
0] => 
            [
1] => 
            [
2] => 
        )

    [
2] => Array
        (
            [
0] => SPOILER1
            
[1] => SPOILER2
            
[2] => SPOILER3
        
)

    [
3] => Array
        (
            [
0] => 
            [
1] => 
            [
2] => 
        )

Помогите, пожалуйста, разобратся sad.gif



Спустя 33 минуты, 34 секунды (15.07.2009 - 14:23) glock18 написал(а):
доброго.

йопрст, а чем тебе не нравится то, что привел ты. а именно 0 и 2 элементы большого массива?

Спустя 15 часов, 28 минут, 43 секунды (16.07.2009 - 05:52) atarix написал(а):
а почему тогда приходят пустые массивы ?
PHP
[1] => Array
        (
            [
0] => 
            [
1] => 
            [
2] => 
        )


Как можно получить массив вида, указанного выше ?

Спустя 50 минут, 22 секунды (16.07.2009 - 06:43) kirik написал(а):
Цитата (atarix @ 15.07.2009 - 21:52)
а почему тогда приходят пустые массивы ?

Потому что нужно разобраться что именно приходит и почему.
Нулевой элемент массива - полная строка, поподающая под шаблон, первый - первая скобочка в паттерне, а точнее то, что совпало с ней (в твоем случае это тэг), второй - вторая скобочка (в твоем случае это текст внутри тэгов), третий - третья скобочка, закрывающий тэг.
Можно предположить, что подобный массив ты выводишь через <pre></pre>, следовательно тэгов ты не видишь, а если заглянуть в код страницы, то ты увидишь настоящий массив.

Цитата (atarix @ 15.07.2009 - 21:52)
Как можно получить массив вида, указанного выше ?

$content1[2]
Советую разобраться с массивами, очень полезно (и вкусно) smile.gif

Спустя 15 минут, 5 секунд (16.07.2009 - 06:58) atarix написал(а):
Цитата (kirik @ 16.07.2009 - 03:43)
Цитата (atarix @ 15.07.2009 - 21:52)
а почему тогда приходят пустые массивы ?

Потому что нужно разобраться что именно приходит и почему.
Нулевой элемент массива - полная строка, поподающая под шаблон, первый - первая скобочка в паттерне, а точнее то, что совпало с ней (в твоем случае это тэг), второй - вторая скобочка (в твоем случае это текст внутри тэгов), третий - третья скобочка, закрывающий тэг.
Можно предположить, что подобный массив ты выводишь через <pre></pre>, следовательно тэгов ты не видишь, а если заглянуть в код страницы, то ты увидишь настоящий массив.

Цитата (atarix @ 15.07.2009 - 21:52)
Как можно получить массив вида, указанного выше ?

$content1[2]
Советую разобраться с массивами, очень полезно (и вкусно) smile.gif

Спасибо, теперь немного начинию понимать biggrin.gif, откуда 4 массива.
C самими тегами понятно почему их не вижу, <pre> и html.
Вопрос такой - можно ли получить последовательность содержимых тега - без "проблемы" соответствия открытого тега - закрытому, и как ?

Спустя 1 час, 2 минуты, 17 секунд (16.07.2009 - 08:00) kirik написал(а):
Цитата (atarix @ 15.07.2009 - 22:58)
опрос такой - можно ли получить последовательность содержимых тега - без "проблемы" соответствия открытого тега - закрытому, и как ?

Можно. Нужно поставить ?: перед тем паттерном, который не нужно запоминать (в скобочках):
Код
/(?:<spoiler.*>)(\w.*)(?:<\/spoiler>)/ismU

Спустя 12 минут, 16 секунд (16.07.2009 - 08:12) atarix написал(а):
при работе этой регулярки с "настоящим" контентом получаю PREG_BAD_UTF8_OFFSET_ERROR, сайт не под UTF8

В контенте 2 тега.
И разбивает массив след. образом - первый элемент всё от начала до конца, следующий со второго тега до конца(это правильно)

Спустя 14 минут, 48 секунд (16.07.2009 - 08:27) glock18 написал(а):
Вопрос, а зачем здесь вообще нужны скобочки (), если паттерны не нужно запоминать (я о тех, что внутри тегов)?

Спустя 7 минут, 27 секунд (16.07.2009 - 08:34) atarix написал(а):
Цитата
Вопрос, а зачем здесь вообще нужны скобочки (), если паттерны не нужно запоминать (я о тех, что внутри тегов)?


Нужны, без них ахинея rolleyes.gif

Спустя 1 день, 2 часа, 39 минут, 47 секунд (17.07.2009 - 11:14) atarix написал(а):
PHP
function ParseSpoiler(&$content)
{
        
$OFFSET 0;
        
$i 0;
        while ((
$startPosition strpos($content"<spoiler>"$OFFSET))!== false)
        {
                
$endInt $startPosition strlen("<spoiler>");
                
$endPosition strpos($content"</spoiler>"$endInt);
                if (
$endPosition === false)
                        break;
                
$topContent substr($content0$startPosition);
                
$tabsectionContent substr($content,$startPosition strlen("<spoiler>"),$endPosition $startPosition strlen("<spoiler>"));
                
$bottomContent substr($content$endPosition strlen("</spoiler>"));
                
$name "spoiler".$i;
                
$name_hidden "spoiler".$i."_hidden";
                
$container "<div id=\"".$name."\" onclick=\"Spoiler(this.id);\"><b>+/-</b></div><div id=\"".$name_hidden."\" style=\"display:none\">".$tabsectionContent."</div>";
                
$content $topContent.$container.$bottomContent;
                
$OFFSET $startPosition;
                
$i++;
        }
}


rolleyes.gif

Спустя 5 часов, 58 минут, 33 секунды (17.07.2009 - 17:13) kirik написал(а):
atarix
любитель поизвращаться smile.gif А как же любые символы после <spoiler? (<spoiler.*>)

Спустя 6 дней, 50 минут, 11 секунд (23.07.2009 - 18:03) Magikan написал(а):
Цитата (atarix @ 17.07.2009 - 08:14)
PHP
function ParseSpoiler(&$content)
{
        $OFFSET = 0;
        $i = 0;
        while (($startPosition = strpos($content, "<spoiler>", $OFFSET))!== false)
        {
                $endInt = $startPosition + strlen("<spoiler>");
                $endPosition = strpos($content, "</spoiler>", $endInt);
                if ($endPosition === false)
                        break;
                $topContent = substr($content, 0, $startPosition);
                $tabsectionContent = substr($content,$startPosition + strlen("<spoiler>"),$endPosition - $startPosition - strlen("<spoiler>"));
                $bottomContent = substr($content, $endPosition + strlen("</spoiler>"));
                $name = "spoiler".$i;
                $name_hidden = "spoiler".$i."_hidden";
                $container = "<div id=\"".$name."\" onclick=\"Spoiler(this.id);\"><b>+/-</b></div><div id=\"".$name_hidden."\" style=\"display:none\">".$tabsectionContent."</div>";
                $content = $topContent.$container.$bottomContent;
                $OFFSET = $startPosition;
                $i++;
        }
}


rolleyes.gif

Все можно было сделать проще
PHP
function ParseSpoiler($buffer)
{
preg_match_all('/<spoiler[^>]*>(.*?)<\/spoiler>/i',$buffer,$spoiler);
return 
$spoiler;
}


[0] индекс содержит все найденные результаты искомого шаблона
PHP
$spoiler[0]=
Array
(
[
0] => <spoiler>SPOILER1</spoiler>
[
1] => <spoiler>SPOILER2</spoiler>
[
2] => <spoiler>SPOILER3</spoiler>
)


[1] индекс содержит все найденные результаты которые заключены в первых (дужках) в нашем случае это символы между тегами

PHP
$spoiler[1]=
Array
(
[
0] => SPOILER1
[1] => SPOILER2
[2] => SPOILER3
)







Спустя 4 дня, 13 часов, 24 минуты, 51 секунда (28.07.2009 - 07:28) atarix написал(а):
Цитата (kirik @ 17.07.2009 - 14:13)
atarix
любитель поизвращаться smile.gif А как же любые символы после <spoiler? (<spoiler.*>)

biggrin.gif
Не могу пока догнать регулярки huh.gif
Пусть так останется, всем спасибо ! wink.gif
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.