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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с регулярным выражением, в php4 работает в php5 нет 
:(
    Опции темы
FireDemon
Дата 24.3.2008, 21:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Есть регулярное выражение:
Код
/{([^:}]+)(:([^}]+))?(.*){\/\\1}/s


Есть шаблон который должен парсится:
Код

{greeting}

today is {date}, {name}

<p>{img:44e1a0769f22c81eabdb54c1585d24c8.jpeg:left}текст</p>

<table>{news:Новинки:3:<tr><td colspan=2><hr></td></tr>}
<tr valign=top>
<td rowspan=2>{img:{file}:width=150}</td>
<td><b>{newsname}</b></td>
</tr>
<tr>
<td height=100% valign=top>{descr}</td>
</tr>{/news}
</table>

{own_name}
{own_email}


В php4 все работало, а в php5 не работает.

Кто знает подскажите пожалуйста.
PM MAIL   Вверх
alexbess
Дата 24.3.2008, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



может так будет работать?
Код

/\{([^:\}]+)(:([^\}]+))?(.*)\{\/\\1\}/s


Это сообщение отредактировал(а) alexbess - 24.3.2008, 22:56
PM MAIL   Вверх
ksnk
Дата 25.3.2008, 00:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


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

Репутация: 12
Всего: 386



FireDemon, А что эта регулярка делала, когда она работала? ;-) Сейчас она выедает все между {news:... и  {/news}.
Разве что ее можно подправить вот так
Код

/{([^:}]+)(?:\:([^}]+))?(.*?){\/\\1}/s

чтобы убрать лишнюю захватывающую маску и ликвидировать ошибку со слишком жадным завершением...


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
FireDemon
Дата 25.3.2008, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вот весь код функции:
Код

    function Tpl2Str($tpl, $entry =0, $task =0, &$used_files_catalog, $template =0, $vars =array()) 
    {
    $is_sample = !$entry;
    if($entry && is_int($entry)) $entry = load_row('address_book', "id=$entry");
    if(is_int($task)) $task = load_row('tasks', "id=$task");
    $tpl_entries = $vars+array('{greeting}' => "$entry[greeting]", 
                   '{date}' => date('d.m.Y'), 
                   '{own_name}' => $GLOBALS['config']['own_name'], 
                   '{own_email}' => $GLOBALS['config']['own_email'], 
                   '{name}' => $entry['name']);
    while(preg_match("/{([^:}]+)(:([^}]+))?}(.*){\/\\1}/s", $tpl, $m = array(), PREG_OFFSET_CAPTURE)) 
    switch(strtolower($m[1][0])) 
    {
        case "news":
        list($group, $max, $delimeter) = explode(':', $m[3][0]);
        $r ='';
        foreach($GLOBALS['DB']->Query("SELECT files_catalog.* FROM files_catalog LEFT JOIN files_catalog_groups_members ON files_catalog_groups_members.file=files_catalog.id ".
                      "LEFT JOIN files_catalog_groups ON files_catalog_groups_members.group=files_catalog_groups.id ".
                      "LEFT JOIN files_catalog_files ON files_catalog.id=files_catalog_files.file LEFT JOIN files ON files_catalog_files.fid=files.id ".
                      "WHERE files_catalog_groups.name='$group' ".($task?"AND files.tm_add>='$task[tm_last_send]' ":'').
                      "GROUP BY files_catalog.id ORDER BY files.tm_add DESC,files_catalog_files.id DESC".((int)$max>0?" LIMIT $max":'')) as $file_catalog) 
        {
        $r .= ($r!=''?$delimeter:'').SpamPage::Tpl2Str($m[4][0], $entry, $task, $used_files_catalog, $template, array("{file}"=>"#$file_catalog[id]", "{newsname}"=>$file_catalog['name'], "{descr}"=>$file_catalog['comment'])+$vars);
        $used_files_catalog[$file_catalog['id']]=1;
        }
        $tpl = substr_replace($tpl, $r, $m[0][1], strlen($m[0][0]));
        break;
    }
    $tpl = str_replace(array_keys($tpl_entries), array_values($tpl_entries), $tpl);
    if(preg_match_all("/{img:([^:}]+)(:([^}]+))?}/i", $tpl, $m = array(), PREG_SET_ORDER|PREG_OFFSET_CAPTURE)) foreach(array_reverse($m) as $t) 
    {
        if($t[1][0][0]=='#') 
        {
        $file = (int)substr($t[1][0], 1);
        if($is_sample) $url = mkfileurl($GLOBALS['DB']->Query("SELECT fid FROM files_catalog_files WHERE file=$file ORDER BY id DESC LIMIT 1", 1));
        else $url = "cid:".$GLOBALS['DB']->Query("SELECT files.filename FROM files LEFT JOIN files_catalog_files ON files_catalog_files.fid=files.id ".
                             "WHERE files_catalog_files.file=$file ORDER BY files_catalog_files.id DESC LIMIT 1", 1);
        } else $url = $is_sample?mkfileurl($GLOBALS['DB']->Query("SELECT files.id FROM files LEFT JOIN template_files ON template_files.fid=files.id ".                    
                                     "WHERE files.filename='{$t[1][0]}' AND template_files.tid=$template AND template_files.deleted=0", 1)):
                                     "cid:{$t[1][0]}";
        $style=''; $size='';
        if($t[3]) foreach(explode(':', strtolower($t[3][0])) as $param) switch($param) 
        {
        case 'left': $style .= "float:left;"; break;
        case 'right': $style .= "float:right;"; break;
        default: if(preg_match("/^(width|height)=\d+%?$/", $param)) $size .= ' '.$param;
        }
        if($style!='') $style = "style=\"$style\"";
        $tpl = substr_replace($tpl, "<img src='$url' $size $style>", $t[0][1], strlen($t[0][0]));
    }
    return $tpl;
    }

PM MAIL   Вверх
FireDemon
Дата 25.3.2008, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Проблема в том что preg_match("/{([^:}]+)(:([^}]+))?(.*){\/\\1}/s",$tpl,$m = array()) выдает пустой массив, но в php4 все работало.
PM MAIL   Вверх
smartov
Дата 25.3.2008, 11:57 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


свой собственный
****


Профиль
Группа: Экс. модератор
Сообщений: 4225
Регистрация: 2.2.2006
Где: NJ

Репутация: 4
Всего: 259



Функция preg_match вообще массивов не возвращает. Она boolean вертает. 

А если ты про третий параметр, то скажи на милость, зачем там стоит $m = array(). Конечно же ты с такой записью будешь ВСЕГДА получать в $m пустой массив.

Добавлено @ 11:58
Цитата(FireDemon @  25.3.2008,  10:49 Найти цитируемый пост)
но в php4 все работало.

Значит php4 работал неправильно.

Это сообщение отредактировал(а) smartov - 25.3.2008, 13:08
PM MAIL   Вверх
FireDemon
Дата 25.3.2008, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



smartov, спасибо большое.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Тексты | Следующая тема »


 




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


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

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