Что нового

[RegExp] Вытянуть строчку из массива

person888

Новичок
Сообщения
9
Репутация
1
Есть такая функция
Код:
Func searchcoordfish()
$server = "w1."
	_IENavigate($oIE2, "http://" & $server & "dwar.ru/hunt_conf.php")
	_IELoadWait( $oIE2 )
$readbody = _IEBodyReadText ( $oIE2 )
$name_res = "Каменный карп"
$text_site_test = '<item num="21" name="Каменный карп" pic="m-karp2.gif" swf="fish_red.swf" prof="4" quality="0" skill="0" artikul_id="721" x="1069" y="237" farming="0" action_title=""/>'
$X_res = StringRegExp($readbody, '<item num=".*" name="'&$name_res&'" pic=".*" swf=".*" prof=".*" quality=".*" skill=".*" artikul_id=".*" x="(.*?)"', 1)
$Y_res = StringRegExp($readbody, '<item num=".*" name="'&$name_res&'" pic=".*" swf=".*" prof=".*" quality=".*" skill=".*" artikul_id=".*" x=".*" y="(.*?)"', 1)
$farming_now = StringRegExp($readbody, '<item num=".*" name="'&$name_res&'" pic=".*" swf=".*" prof=".*" quality=".*" skill=".*" artikul_id=".*" x=".*" y=".*" farming="(.*?)"', 1)
If $farming_now > 1 Then
	Local $polojeniye_resursa_sbor = "Занят"
EndIf
If $farming_now = 0 Then
	Local $polojeniye_resursa_sbor = "Свободен"
EndIf
	GUICtrlSetData( $input4 , $name_res&" X:"&$xres&" Y:"&$yres&" Ресурс: "& $farmingnow )
	EndFunc


Нужно отобразить в GUI $input4 данные полученные после StringRegExp $X_res, $Y_res и $farming_now
Ломал голову целый день, обыскал форум ничего не получается. :stars:

Когда я использую это все выходит в Array.
Код:
_ArrayDisplay( $x_res )
	_ArrayDisplay( $y_res )
	_ArrayDisplay( $farming_now )
 

ivsatel

Продвинутый
Сообщения
319
Репутация
84
Код:
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
#include <Array.au3>

Global $input1, $input2, $input3, $input4, $btn1, $btn2, $msg, $hGui, $Sourse

Dim $aArray1[1], $aArray2[1], $aArray3[1], $aArray4[1]

$hGui = GUICreate("GUI & 4 input", 380, 160, @DesktopWidth / 2 - 190, @DesktopHeight / 2 - 80, -1, $WS_EX_ACCEPTFILES)
$input1 = GUICtrlCreateInput('', 10, 5, 360, 20)
$input2 = GUICtrlCreateInput('', 10, 35, 360, 20)
$input3 = GUICtrlCreateInput('', 10, 65, 360, 20)
$input4 = GUICtrlCreateInput('', 10, 95, 360, 20)
$btn1 = GUICtrlCreateButton("Ввод", 5, 127, 70, 26)
$btn2 = GUICtrlCreateButton("Очистить", 85, 127, 70, 26)

GUISetState()

While 1

    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            ExitLoop
		Case $btn1
			_STRING_REGEXP()
			GUICtrlSetData($input1, _ArrayToString($aArray1))
			GUICtrlSetData($input2, _ArrayToString($aArray2))
			GUICtrlSetData($input3, _ArrayToString($aArray3))
			GUICtrlSetData($input4, _ArrayToString($aArray4))

		Case $btn2

			GUICtrlSetData($input1, '')
			GUICtrlSetData($input2, '')
			GUICtrlSetData($input3, '')
			GUICtrlSetData($input4, '')
    EndSwitch
WEnd

Func _STRING_REGEXP()
$Sourse = BinaryToString(InetRead('http://rutor.org/new', 1), 4)
$aArray1 = StringRegExp($Sourse, '"http://s\.rutor\.org/logo\.jpg"', 3)
$aArray2 = StringRegExp($Sourse, 'Файлы для обмена предоставлены пользователями сайта\.', 3)
$aArray3 = StringRegExp($Sourse, '"http\:\/\/s\.rutor\.org\/i\/viti\.gif"', 3)
$aArray4 = StringRegExp($Sourse, '"http\:\/\/s\.rutor\.org\/t\/functions\.js"', 3)
EndFunc
 

erlik

Продвинутый
Сообщения
317
Репутация
84
person888
У тебя так то с именами переменных напутано - присваиваешь значения в $X_res, выводишь какую то $xres. К тому же $X_res это массив, где по индексу 0 ($X_res[0]) найденное значение - если StringRegExp вернул совпадение, если нет, то не массив. И так же с прочими переменными. Поэтому проверять значения нужно перед выводом в форму. У меня вообще ничего StringRegExp не находит по этим шаблонам.


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

И правильно делает, что не находит так как "_IEBodyReadText
возвращает текст, находящийся внутри тегов <body>."
А ты пытаешься найти значения Внутри тегов, которые _IEBodyReadText не возвращает.
Вот что она возвращает:
Мой Мир@Mail.ru ВКонтакте Одноклассники Facebook

Лучшие игроки


КаЗаХ [16]
wg_mOre4Ok [16]
Илюша-смерч [16]
TorWar [16]
ДжоГанс [16]
Дункан [16]
BIGMAK [16]
Egan70 [16]
Nikuradze [16]
WogGrif [16]

TorWar [16]
Дункан [16]
Nikuradze [16]
ЗмЕЕЕд [16]
Sobrrus [16]
Secular Bird [16]
хозяин чучи [16]
Diamond [16]
Амон Ра [16]
James74 [16]
и т.д

Каr видно никакими тегами <item тут и не пахнет. Так что или скачивай страницу целиком через
Код:
InetGet, InetRead
или пробуй использовать методы IE.au3 возвращающие коллекции тегов(здесь не уверен, так как с ними не работал).
---------------------------------
Совсем забыл -
Код:
_IEDocReadHTML
возвращает полный исходный текст страницы, но по твоим шаблонам все равно ничего не находится.
...Скачал весь исходный текст страницы, засунул в notepad++ и запустил поиск на наличие <item. Пусто. Спрашивается - ищем кота в мешке, которого нет?
 
Автор
P

person888

Новичок
Сообщения
9
Репутация
1
Суть не в _IEBodyReadText он все прекрасно возвращает если зайти в игру, но за совет спасибо попробую использовать и если получится перейду на этот метод получения текста со страницы.

Спасибо это и нужно было мне

Код:
_ArrayToString


Решение найдено :beer:
 

erlik

Продвинутый
Сообщения
317
Репутация
84
...это и нужно было мне
_ArrayToString
Ну да, будем из гаубицы палить по воробьям :rofl: Описание и предназначение функции _ArrayToString все таки стоило бы почитать.
У тебя в возвращаемых массивах всего одно значение по одному единственному индексу.
Поэтому достаточно проверить каждое значение вот так:
Код:
if IsArray($X_res) Then
$xres=$X_res[0]
Endif

чтобы затем спокойно выводить все на форму.
А вот если полученное значение (многоиндексный массив) нужно засунуть в одну строку разделив сепаратором , тогда другое дело.
 
Верх