Модераторы: Aliance, skyboy, MoLeX, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> использование повтора внутри шаблона, preg_match_all 
:(
    Опции темы
z-END
Дата 10.6.2013, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прафесар™
****


Профиль
Группа: Комодератор
Сообщений: 3014
Регистрация: 13.3.2003
Где: Венья, Пиетари

Репутация: нет
Всего: 102



Задача казалось бы простейшая - нужно получить названия всех переменных массива $array[XXX], которые находятся внутри комментариев в теле страницы. 

Код


<?php
$tpl='<html>
    <!--$array[first]-->
    <some tags>
        <!-- comments and data $array[values] -->
        <some_tags>
        <!-- comments and data $array[extra info] information about something else $array[info] -->
        </some_tags>
        <text_tag>
        $array[this_data_must_be_excluded]
        </text_tag>
    </some_tags>
    </html>
';

preg_match_all('/<!--(?:.*)\$array\[(.*)\](?:.*)-->/sU', $tpl, $results, PREG_PATTERN_ORDER);
var_dump($results);



Цитата

array
  0 => 
    array
      0 => string '<!--$array[first]-->' (length=20)
      1 => string '<!-- comments and data $array[values] -->' (length=41)
      2 => string '<!-- comments and data $array[extra info] information about something else $array[info] -->' (length=91)
  1 => 
    array
      0 => string 'first' (length=5)
      1 => string 'values' (length=6)
      2 => string 'extra info' (length=10)

но, в таком варианте получается только первое значение -  $array[extra_info] находит, а $array[info] уже нет... а как добавить повторение  что-то не соображу.. как быть? )




--------------------
Каждый чилавек пасвоему праф...а памоему НЕТ! 

PM WWW ICQ   Вверх
Gromdron
Дата 13.6.2013, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 4.9.2006

Репутация: нет
Всего: 1



А вы попробуйте сначала отсеивать нужные строки по принципу <!--(.*)--> а потом НЕ жадной регуляркой искать $array\[(.*)\]

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
z-END
Дата 13.6.2013, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прафесар™
****


Профиль
Группа: Комодератор
Сообщений: 3014
Регистрация: 13.3.2003
Где: Венья, Пиетари

Репутация: нет
Всего: 102



Gromdron,  уже была мысль обычным substr сначала вытащить все что внутри комментариев , и потом регуляркой уже по отфильтрованному тексту выдергивать $array... но как-то  не научно выглядит)  


--------------------
Каждый чилавек пасвоему праф...а памоему НЕТ! 

PM WWW ICQ   Вверх
krypt3r
Дата 14.6.2013, 07:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 359
Регистрация: 9.6.2009

Репутация: 1
Всего: 16



Код

$values = array ();
preg_match_all ('/<!--(.*?)-->/s', $tpl, $m);
foreach ($m[1] as $cline)
{
    if (preg_match_all ('/\$array\[(.*?)\]/', $cline, $matches))
    {
        //print_r ($matches[1]);
        foreach ($matches[1] as $m_m)
        {
            $values[] = $m_m;
        }
    }
}
print_r ($values);

Код

Array
(
    [0] => first
    [1] => values
    [2] => extra info
    [3] => info
)

Или разбираться с рекурсивными RE

Это сообщение отредактировал(а) krypt3r - 14.6.2013, 07:04
PM MAIL   Вверх
z-END
Дата 14.6.2013, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прафесар™
****


Профиль
Группа: Комодератор
Сообщений: 3014
Регистрация: 13.3.2003
Где: Венья, Пиетари

Репутация: нет
Всего: 102



как по мне - две регулярки это перебор, по этому пока решил так:
Код

                $open = "<!--";
                $close = "-->";
                $found = strpos ($tpl, $open);
                $restpl = '';
                while ($found!==false) {
                    $last = strpos($tpl, $close, $found);
                    if (!$last) {
                           $found = false;
                           continue;
                    }
                    $restpl.= " ".substr ($tpl, $found+strlen($open), $last-$found-strlen ($close)-1);
                    $found = strpos ($tpl, $open, $last);
                }
                preg_match_all ('/\$array\[(.*)\]/sU', $restpl, $result, PREG_PATTERN_ORDER);

но мои сомнения в бесполезности регулярок  укрепились ))


--------------------
Каждый чилавек пасвоему праф...а памоему НЕТ! 

PM WWW ICQ   Вверх
Gromdron
Дата 14.6.2013, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 4.9.2006

Репутация: нет
Всего: 1



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

А если пробовать регуляркой то условия должны быть сложнее, типа: Перед выражением должно стоять <!-- на любых позициях и не должно стоять -->, при этом если стоит --> то открывающих <!-- должно быть на 1 больше... в общем длинное и запутанное условие получается. ИМХО проще получить строки и уже в них найти.

P.S. хотя можно попробовать считать теги <!-- и --> и генерировать ее находу, но это уже темная сторона кода, да и профита никакого не будет :)

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Тексты | Следующая тема »


 




[ Время генерации скрипта: 0.1380 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.