Что нового

Не получается получить массив с помощью stringregexp

Malderin

Новичок
Сообщения
68
Репутация
1
Есть некий HTML код, вот его кусок для примера.

Код:
					<td class="sellitem">
					<div class="tdtop">
					</div>
					<table class="iteminfo">
						<tr>
							<td class="leftpart" valign="top">
							<div class="sellimageblock">
								<img src=" /image/sword/mzaklep.gif"></div>
							<div class="sellbutton15" style="cursor: pointer;" onclick="SalesProd(&quot; http://rizing_sun.ru/cgi-bin/srv.exe/buyitem?tmpid=01945946049577723644&amp;action=2&amp;itemf=mzaklep1254932&amp;numpos=&amp;t=141470390&quot;,&quot;Заклепки&quot;)" ;>
								продать</div>
							</td>
							<td class="rightpart"><b>Заклепки</b>

							<font color="red">Цена: 50</font>

							Уровень улучш.: 0

							Долговечность: 300

							Требования: 

							Масса: 5

							Уровень: 10

							Используется человеком</td>
						</tr>
					</table>
					</td>
				</tr>
				<tr>
					<td class="sellitem">
					<div class="tdtop">
					</div>
					<table class="iteminfo">
						<tr>
							<td class="leftpart" valign="top">
							<div class="sellimageblock">
								<img src=" /image/sword/bad_eqp.gif"></div>
							<div class="sellbutton">
								<a href=" http://rizing_sun.ru/cgi-bin/srv.exe/buyitem?tmpid=01945946049577723644&action=2&itemf=n4255084b_eqp&numpos=&t=141470399">
								продать</a></div>
							</td>
							<td class="rightpart"><b>Испорченный предмет</b>

							<font color="red">Цена: 1</font>

							Уровень улучш.: 0

							Долговечность: 0

							Требования: 

							Масса: 10

							Уровень: 0</td>
						</tr>
					</table>
					</td>
				</tr>
				<tr>
				<tr>
					<td class="sellitem">
					<div class="tdtop">
					</div>
					<table class="iteminfo">
						<tr>
							<td class="leftpart" valign="top">
							<div class="sellimageblock">
								<img src=" /image/sword/bad_eqp.gif"></div>
							<div class="sellbutton">
								<a href=" http://rizing_sun.ru/cgi-bin/srv.exe/buyitem?tmpid=01945946049577723644&action=2&itemf=n4255084b_eqp&numpos=&t=141470391">
								продать</a></div>
							</td>
							<td class="rightpart"><b>Испорченный предмет</b>

							<font color="red">Цена: 1</font>

							Уровень улучш.: 0

							Долговечность: 0

							Требования: 

							Масса: 10

							Уровень: 0</td>
						</tr>
					</table>
					</td>
				</tr>
				<tr>
				<tr>
					<td class="sellitem">
					<div class="tdtop">
					</div>
					<table class="iteminfo">
						<tr>
							<td class="leftpart" valign="top">
							<div class="sellimageblock">
								<img src=" /image/sword/bad_eqp.gif"></div>
							<div class="sellbutton">
								<a href=" http://rizing_sun.ru/cgi-bin/srv.exe/buyitem?tmpid=01945946049577723644&action=2&itemf=n4255084b_eqp&numpos=&t=141470392">
								продать</a></div>
							</td>
							<td class="rightpart"><b>Испорченный предмет</b>

							<font color="red">Цена: 1</font>

							Уровень улучш.: 0

							Долговечность: 0

							Требования: 

							Масса: 10

							Уровень: 0</td>
						</tr>
					</table>
					</td>
				</tr>
				<tr>
					<td class="sellitem">
					<div class="tdtop">
					</div>
					<table class="iteminfo">
						<tr>
							<td class="leftpart" valign="top">
							<div class="sellimageblock">
								<img src=" /image/sword/OraculMap.gif"></div>
							<div class="sellbutton">
								<a href=" http://rizing_sun.ru/cgi-bin/srv.exe/buyitem?tmpid=01945946049577723644&action=2&itemf=OraculMap2254947&numpos=&t=141470390">
								продать</a></div>
							</td>
							<td class="rightpart"><b>Кусочек карты</b>

							<font color="red">Цена: 0</font>

							Уровень улучш.: 0

							Долговечность: 10

							Требования: 

							Масса: 5

							Уровень: 3

							Выносливость: 4

							Поиск сокровища

							Используется человеком</td>
						</tr>
					</table>
					</td>
				</tr>

Требуется сделать следующее. Найти все "Испорченные предметы" и выделить в массив ссылки на их продажу, т.е. для первого испорченного предмета ссылка имеет вид:
Код:
http://rizing_sun.ru/cgi-bin/srv.exe/buyitem?tmpid=01945946049577723644&action=2&itemf=n4255084b_eqp&numpos=&t=141470399
и т.д., всего в примере кода испорченных предметов три как и ссылок.

Написал вот такой вот код (приведенный выше HTML-код сохранен в папке со скриптом в файл код.txt для экпериментов):
Код:
#include <Array.au3>

$sFile1 = FileOpen(@ScriptDir&"\код.txt", 0)
$sHtml1 = FileRead($sFile1)
 
$isp_predmet = '(?s)(?i).*(http.*b_eqp.*?)">.*Испорченный\sпредмет'
$res_isp_predmet = StringRegExp($sHtml1, $isp_predmet, 3)
_ArrayDisplay($res_isp_predmet)


В итоге, несмотря на флаг 3 у StringRegExp (возврат всех совпадений) в массив идёт только одно последнее совпадение.
Мне нужны все 3 ссылки в массиве а не одна, подскажите что не так ?
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333

Вы используете жадные квантификаторы, которые честно отрабатывают, съедая всё что внутри
(подробнее про жадость квантификаторов почитайте тут http://autoit-script.ru/index.php?topic=4901.0)

А шаблон можно подправить вот таким образом, например
Код:
$isp_predmet = '(?s)(?i).*?(http[^>]*?b_eqp.*?)">\D*?Испорченный\sпредмет'
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Я бы еще \s поменял на \h.
 
Автор
M

Malderin

Новичок
Сообщения
68
Репутация
1
C2H5OH сказал(а):

Вы используете жадные квантификаторы, которые честно отрабатывают, съедая всё что внутри
(подробнее про жадость квантификаторов почитайте тут http://autoit-script.ru/index.php?topic=4901.0)

А шаблон можно подправить вот таким образом, например
Код:
$isp_predmet = '(?s)(?i).*?(http[^>]*?b_eqp.*?)">\D*?Испорченный\sпредмет'
Действительно, про жадность квантификаторов я конечно знал, но ограничить их правильно честно говоря не смог, спасибо!
 
Автор
M

Malderin

Новичок
Сообщения
68
Репутация
1
madmasles сказал(а):
Я бы еще \s поменял на \h.
Да, наверное так действительно правильнее будет, спасибо.


Добавлено:
Сообщение автоматически объединено:

alex33 сказал(а):
Простой парсер HTML кода
Для работы с XML, HTML, JS и многим другим есть специальные объекты.
Это надо долго разбираться и изучать, а с регулярными выражениями я уже встречался, с ними мне пока проще, да и не до конца там то разобрался чтобы за что то новое хвататься. Отложу на будущее в общем :smile:

Так секундочку, рано я что то обрадовался, посмотрел повнимательнее на результат и увидел вот что:
Код:
[0]|http://rizing_sun.ru/cgi-bin/srv.exe/buyitem?tmpid=01945946049577723644&amp;action=2&amp;itemf=mzaklep1254932&amp;numpos=&amp;t=141470390&quot;,&quot;Заклепки&quot;)" ;>
								продать</div>
							</td>
							<td class="rightpart"><b>Заклепки</b>

							<font color="red">Цена: 50</font>

							Уровень улучш.: 0

							Долговечность: 300

							Требования: 

							Масса: 5

							Уровень: 10

							Используется человеком</td>
						</tr>
					</table>
					</td>
				</tr>
				<tr>
					<td class="sellitem">
					<div class="tdtop">
					</div>
					<table class="iteminfo">
						<tr>
							<td class="leftpart" valign="top">
							<div class="sellimageblock">
								<img src=" /image/sword/bad_eqp.gif"></div>
							<div class="sellbutton">
								<a href=" http://rizing_sun.ru/cgi-bin/srv.exe/buyitem?tmpid=01945946049577723644&action=2&itemf=n4255084b_eqp&numpos=&t=141470399
[1]|http://rizing_sun.ru/cgi-bin/srv.exe/buyitem?tmpid=01945946049577723644&action=2&itemf=n4255084b_eqp&numpos=&t=141470391
[2]|http://rizing_sun.ru/cgi-bin/srv.exe/buyitem?tmpid=01945946049577723644&action=2&itemf=n4255084b_eqp&numpos=&t=141470392

Почему то шаблон не взял ещё одну ссылку которая вроде как подходит по условию поиска, вот эту вот:
Код:
http://rizing_sun.ru/cgi-bin/srv.exe/buyitem?tmpid=01945946049577723644&action=2&itemf=n4255084b_eqp&numpos=&t=141470399
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Приведённый мной шаблон редактировался после его появления на форуме.
Проверьте что Вы используете последнюю редакцию
Код:
$isp_predmet = '(?s)(?i).*?(http[^>]*?b_eqp.*?)">\D*?Испорченный\hпредмет'
 
Автор
M

Malderin

Новичок
Сообщения
68
Репутация
1
C2H5OH сказал(а):
Приведённый мной шаблон редактировался после его появления на форуме.
Проверьте что Вы используете последнюю редакцию
Код:
$isp_predmet = '(?s)(?i).*?(http[^>]*?b_eqp.*?)">\D*?Испорченный\hпредмет'
Да, действительно. Этот шаблон работает нормально, спасибо.
 
Автор
M

Malderin

Новичок
Сообщения
68
Репутация
1
Я вот смотрю и немного не могу понять в чем разница.
Предложенный вариант (http[^>]*?b_eqp.*?) я в принципе понимаю. Найти Http, далее любой символ кроме ">" (он в искомой ссылке встретится никак не может), повторяющийся любое количество раз пока не встретится b_eqp.
Почему в таком случае не работает (http.*?b_eqp.*?) ?
".*" по сути то же самое что и "[^>]*", любой символ повторяющийся любое количество раз после http, пока не встретится b_eqp. Может кто нибудь мне это объяснить, не доходит до меня.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Представь что вдруг, документ начинается со слова http. Твой шаблон http.*?b_eqp.*? начав искать http обнаруживает его в самом начале, и радостно ищет дальше все подряд (.*?) пока не наткнется на b_eqp.
Так конечно оно работает, но твой паттерн начнет поиск с самого первого найденного http. А там может быть http://autoit-script.ru/, что явно тебе не подходит.
 
Автор
M

Malderin

Новичок
Сообщения
68
Репутация
1
inververs сказал(а):
Представь что вдруг, документ начинается со слова http. Твой шаблон http.*?b_eqp.*? начав искать http обнаруживает его в самом начале, и радостно ищет дальше все подряд (.*?) пока не наткнется на b_eqp.
Так конечно оно работает, но твой паттерн начнет поиск с самого первого найденного http. А там может быть http://autoit-script.ru/, что явно тебе не подходит.
Пожалуй да, теперь до меня дошло в чем разница, благодарю!
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Вариант от меня:
Код:
#include<Array.au3>

$sText = FileRead("18406.txt")
$aBad = StringRegExp($sText, '(?<=href=").*b_eqp.*\b', 3)
_ArrayDisplay($aBad)
 
Автор
M

Malderin

Новичок
Сообщения
68
Репутация
1
Garrett сказал(а):
Вариант от меня:
Код:
#include<Array.au3>

$sText = FileRead("18406.txt")
$aBad = StringRegExp($sText, '(?<=href=").*b_eqp.*\b', 3)
_ArrayDisplay($aBad)

Хоть мне это уже и не нужно, но все равно спасибо, благодаря этому примеру теперь понятно как искать вперед-назад, тоже не очень понятно было.
 
Верх