Проблема с реферами при разборе лога

xRay

Новичок
Проблема с реферами при разборе лога

Я пишу несложный скрипт для пост обработки статистики предоставляемой Webalizer'ом.

Вот кусок кода
Код:
   $rbk_url  ="http://tse/report_processing/1.html";
              $fcont = file ($rbk_url);
              $fcontents = implode ('', $fcont);
              $count = preg_match_all ("|<(.*)(.*)>(.*)</(.*)>|U", 
              $fcontents, 
              $matches, PREG_PATTERN_ORDER);
   print "<pre>";
   print_r ($matches);
   print "</pre>";
Файл отчета содержит посковые слова которые по которым пользователи приходят на сайт и не все они в нормальном виде.
Есть еще естественно и такие %22%EB%CF%CE%C4%C9%D4%C5%D2%D3%CB%CF%C5 (и таких большинство).

Проблема с тем что строки вида %22%EB%CF%
в массиве $matches вообще отсутствуют и вместо них только пустое место.
Как раскодировать их я знаю.
Я вот чего немогу понять. Почему они пустые получаються.
Вроде регэксп правильно написан.
Помогите пожалуйста.
 

xRay

Новичок
Помогите плтз. Ну очень надо с этим разделаться.
 

Макс

Старожил PHPClub
будет больше пользы, если ты покажешь пример строки, для которой ты применяешь этот регексп
 

xRay

Новичок
Вот кусок html
Код:
  <TR>
    <TD align=middle><FONT size=-1><B>10</B></FONT></TD>
    <TD align=right><FONT size=-1><B>2</B></FONT></TD>
    <TD align=right><FONT size=-2>1.65%</FONT></TD>
    <TD noWrap align=left><FONT size=-1>русское радио камышин</FONT></TD></TR>
  <TR>
    <TD align=middle><FONT size=-1><B>11</B></FONT></TD>
    <TD align=right><FONT size=-1><B>1</B></FONT></TD>
    <TD align=right><FONT size=-2>0.83%</FONT></TD>
    <TD noWrap align=left><FONT 
      size=-1>%22%EB%CF%CE%C4%C9%D4%C5%D2%D3%CB%CF%C5 
      %D0%D2%CF%C9%DA%D7%CF%C</FONT></TD></TR>
  <TR>
    <TD align=middle><FONT size=-1><B>12</B></FONT></TD>
    <TD align=right><FONT size=-1><B>1</B></FONT></TD>
    <TD align=right><FONT size=-2>0.83%</FONT></TD>
    <TD noWrap align=left><FONT size=-1>%C4%C5%CE%D8 %D2%CF%D6%C4%C5%CE%C9%D1 
      %CB%CF%CD%D0%C1%CE%C9%C9</FONT></TD></TR>
  <TR>
    <TD align=middle><FONT size=-1><B>13</B></FONT></TD>
    <TD align=right><FONT size=-1><B>1</B></FONT></TD>
    <TD align=right><FONT size=-2>0.83%</FONT></TD>
    <TD noWrap align=left><FONT size=-1>%C4%C5%CE%D8 
      %D3%D4%D5%C4%C5%CE%D4%C1</FONT></TD></TR>
  <TR>
    <TD align=middle><FONT size=-1><B>14</B></FONT></TD>
    <TD align=right><FONT size=-1><B>1</B></FONT></TD>
    <TD align=right><FONT size=-2>0.83%</FONT></TD>
    <TD noWrap align=left><FONT size=-1>%CD%C1%DB%C9%CE%C1 %D7 
      %CB%D2%C5%C4%C9%D4</FONT></TD></TR>
  <TR>
А вообще я этим регэкспом весь файл отчета полученный после Webalizer'a прохожу.
 

xRay

Новичок
Maxim Matyukhin
Нет так еще не пробовал.
Пойду попробую.
Сапсибо.
 

xRay

Новичок
Maxim Matyukhin
Попробовал получается просто текст без тегов одним куском.
Меня в принципе устраивает мой регэксп, но то что
строки типа %D3%D4%D5%C4%C5%CE%D4%C1 пусты в массиве $matches получаются. Вот это мне покоя не дает.
Мне одним куском текст безполезен т.к. по нему еще нужно добраться до нужных строчек. В массиве $matches все просто.

Я уже подозреваю что мой регэксп не все теги ловит.
А мне надо все да еще вложенные и со всеми параметрами по-полочкам.
 

xRay

Новичок
Maxim Matyukhin
Добавил модификатор s все как стало ОК. Тольео проц заметно больше стал загружен, да и процесс обработки сильно замедлился.

Объясни плиз почему модификатор s помог? (я вроде сним раньше пробовал такой же еффект был)
Да и еще. Есть ли альтернатива этому модификатору менее прожорливая?

Чего я не пойму почему не ловились без этого модификатора строки типа %D3%D4%D5%C4%C5%CE%D4%C1?

Спасибо.
 

lucas

Guest
Есть ли альтернатива этому модификатору менее прожорливая?
Попробуй предварительно делать так:

PHP:
$data = preg_replace("/\\n*\\r\\n* */","",$data) ;
И работать без модификатора s.
 

xRay

Новичок
lucas
Попробовал как ты написал. В результате не ловятся строки типа %D3%D4%D5%C4%C5%CE%D4%C1

Блин где правда? И по чему эти строки типа %D3%D4%D5%C4%C5%CE%D4%C1 не ловятся без использования модификатора s?

Все нормально отлавливается моим регэкспом кроме этих чертовых строк типа %D3%D4%D5%C4%C5%CE%D4%C1. И работает быстро.

Я пробовал воспользоваться htmlparser'ом (автор [email protected]), но он так грузит систему при построении дерева тегов что за такую нагрузку мне хостер голову оторвет нафиг. :(
 

[DAN]

Старожил PHPClub
попробуй использовать xml для разбора логов.
только у тебя html должен быть валидный.
 

xRay

Новичок
[DAN]
Html валидный я проверял еще до того как стал сним возиться.
Приведи плиз пример.
 

[DAN]

Старожил PHPClub
в мануале (XML parser) есть пример разбора документа.
Если использовать domxml, то еще проще получается.
Грузишь документ, выбираешь с помощью XPath все узлы, которые тебе нужны, и работаешь с ними.

Тут есть один существенный момент. Если файл логов большой (3 и более Мб), то использование DOM-модели (domxml ext.) будет неэффективно, т.к. в памяти строится все дерево документа.
В этом случае лучше использовать SAX-парсер (xml ext.)
 

xRay

Новичок
[DAN]
Да все понятно. Спасибо. Я с xml разбором знаком. Предпочтение отдаю XPath.

Мне хочеться разобраться с этими чертовыми строками типа %D3%D4%D5%C4%C5%CE%D4%C1, какого они не хотят моим регэкспом без модификатора s ловиться?
 

fixxxer

К.О.
Партнер клуба
Мне хочеться разобраться с этими чертовыми строками типа %D3%D4%D5%C4%C5%CE%D4%C1, какого они не хотят моим регэкспом без модификатора s ловиться?
<TD noWrap align=left><FONT size=-1>%C4%C5%CE%D8 \n
%D3%D4%D5%C4%C5%CE%D4%C1</FONT></TD></TR>
[m]pcre[/m]:
s (PCRE_DOTALL)
If this modifier is set, a dot metacharacter in the pattern matches all characters, including newlines. Without it, newlines are excluded.
 

Макс

Старожил PHPClub
xRay
без S твой регексп не работает потому чтоу тебя в строках
%C4%C5%CE%D8 %D2%CF%D6%C4%C5%CE%C9%D1
%CB%CF%CD%D0%C1%CE%C9%C9
есть символ перевода строки, а точка не совпадает с символов перевода строки (если не указан модификатор s).

Объясни, что ты хочешь получить этим регекспом. Может его оптимизировать можно.

> Html валидный я проверял еще до того как стал сним возиться.
AFAIK валидный HTML (правильнее будет сказать "HTML валидный для обработки его XML-парсером") должен иметь кавычки в аттрибутах тегов (<td align="center">)
 

xRay

Новичок
Спасибо всем за помощь.

Maxim Matyukhin
Все ОК. Я предварительно поубивал \n
PHP:
$data = preg_replace("/\\n/","",$fcontents);
и все запахало.

Вот на счет оптимизации регэкспа. Мне надо от него
разбор html на составляющие теги, параметры тегов,
текст внутри тегов.

HTML я CSE HTML Validator'ром проверял все ОК.
 

fixxxer

К.О.
Партнер клуба
Для разбора как XML, необходим XHTML. То есть одиночные тэги должны записываться как <тэг />, например <br />.

Еще посмотри HTML Parser -> http://anton.concord.ru
 

xRay

Новичок
fixxxer
Для разбора как XML, необходим XHTML. То есть одиночные тэги должны записываться как <тэг />, например <br />.
Да спасибо я знаю. На данном этапе работ мне пока XML разбор не нужен.

Я пробовал воспользоваться htmlparser'ом (автор [email protected]), но он так грузит систему при построении дерева тегов что за такую нагрузку мне хостер голову оторвет нафиг.
Может я им как-то не так воспользовался?
 
Сверху