Фантастика с регуляркой preg_match_all

12
LEOnidUKG
На сайте с 25.11.2006
Offline
1755
843

Есть файлик прайс.

Беру составляю регулярку:

preg_match_all("@<td class=xl83 width=617 style='width:463pt'>.*?</td>(.*?)<td height=21 class=xl82 style='height:16\.35pt'>&nbsp;</td>@smi",$pricemass,$tmpx);

Опа... из 63 строк видет только 2.

Ладно думаю, проверю в notepad++

Проверяю. Он находит все 63.

Это как называется?! Куда копать? :)

---------- Добавлено 14.05.2012 в 20:54 ----------

Главное удаляю тот текст который он нашёл. Он бац, находит следующий и опять тормозит, и так каждый руками удаляешь и только потом он его находит.

✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/ ✅ Настройка и оптимизация серверов https://getmanyspeed.ru/
dkameleon
На сайте с 09.12.2005
Offline
386
#1

попробуй

U (PCRE_UNGREEDY)

или я формат файла неправильно себе представляю?

Дизайн интерьера (http://balabukha.com/)
S5
На сайте с 04.01.2010
Offline
77
#2

а что такое @ в начале? насколько я помню регулярка выглядит так "/(.*?)/i"

LEOnidUKG
На сайте с 25.11.2006
Offline
1755
#3
sg552:
а что такое @ в начале? насколько я помню регулярка выглядит так "/(.*?)/i"

Мануалы почитайте.

---------- Добавлено 14.05.2012 в 21:22 ----------

dkameleon:
попробуй
U (PCRE_UNGREEDY)

или я формат файла неправильно себе представляю?

Дык у меня же ?. Какая разница? Хоть его убрать и поставить U толку нету.

---------- Добавлено 14.05.2012 в 21:26 ----------

Если использовать .* вместо .*? то просто до конца берёт данные т.е. все блоки.

Я не понимаю почему это работает в блокноте, а пхп начинается выёживаться.

dlyanachalas
На сайте с 15.09.2006
Offline
693
#4
LEOnidUKG:
Есть файлик прайс.

Беру составляю регулярку:
preg_match_all("@<td class=xl83 width=617 style='width:463pt'>.*?</td>(.*?)<td height=21 class=xl82 style='height:16\.35pt'>&nbsp;</td>@smi",$pricemass,$tmpx);

Опа... из 63 строк видет только 2.
Ладно думаю, проверю в notepad++

Проверяю. Он находит все 63.

Это как называется?! Куда копать? :)

---------- Добавлено 14.05.2012 в 20:54 ----------

Главное удаляю тот текст который он нашёл. Он бац, находит следующий и опять тормозит, и так каждый руками удаляешь и только потом он его находит.

Слеш забыли поставить <\/td>

LEOnidUKG
На сайте с 25.11.2006
Offline
1755
#5
dlyanachalas:
Слеш забыли поставить <\/td>

Посмотрите какой я оператор использую. Мне не надо это экранировать.

dkameleon
На сайте с 09.12.2005
Offline
386
#6
LEOnidUKG:
Дык у меня же ?. Какая разница? Хоть его убрать и поставить U толку нету.

точно. тупанул.

давай тогда кусок текста, бум пробовать :)

ПС. я бы аттрибуты в регулярке упростил - не указывал все.

W
На сайте с 10.05.2009
Offline
114
#7

может стоит попробывать уменьшить регулярку, возможно не стоит так точно прописывать окончание? Или вам вся строка нужна и вы обрабатываете нулевой масив?

sabotage
На сайте с 14.02.2007
Offline
192
#8

И все-таки очень похоже на жадность. Смотреть подробнее лень, покопай в эту сторону.

LEOnidUKG
На сайте с 25.11.2006
Offline
1755
#9

http://yourcommentit.ru/price2.html

Можете прямо file_get_contents отудова. Я даже упростил код и сделал замену в блокноте. Новая регулярка:

preg_match_all("@STARTPARS(.*?)MEZAG@smi",$pricemass,$tmpx);

Результат тот же :D

Даже смешно. У меня такое подозрение, что дело в кодировке т.к. файл напрямую из экселя.

---------- Добавлено 14.05.2012 в 21:45 ----------

sabotage:
И все-таки очень похоже на жадность. Смотреть подробнее лень, покопай в эту сторону.

Да я уже 3-и часа копаю. Не жадность это.

---------- Добавлено 14.05.2012 в 22:20 ----------

Всё фантастика закончилась. На этих параметрах.

[Pcre]

;PCRE library backtracking limit.

pcre.backtrack_limit=10000000

;PCRE library recursion limit.

;Please note that if you set this value to a high number you may consume all

;the available process stack and eventually crash PHP (due to reaching the

;stack size limit imposed by the Operating System).

pcre.recursion_limit=10000000

dkameleon
На сайте с 09.12.2005
Offline
386
#10

а у меня так вышло:

$data = file_get_contents('in.txt');

preg_match_all('#<tr[^>]*>\s*<td[^>]*>(.*)</td>\s*<td[^>]*>(.*)</td>\s*<td[^>]*>(.*)</td>\s*<td[^>]*>(.*)</td>\s*<td[^>]*>(.*)</td>\s*<td[^>]*>(.*)</td>\s*<td[^>]*>(.*)</td>\s*</tr>#misU', $data, $matches, PREG_SET_ORDER);

file_put_contents('out.txt', print_r($matches, true));
12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий