Что нового

[Сеть, интернет] прием пакетов

andreitrane

Новичок
Сообщения
141
Репутация
3
если использовать такой код
Код:
$sMessage = StringRegExpReplace($Response, '(?s<cardLeft>(\d+)</cardLeft>?.*', '\1')

то программа может обрабатывать данные, если вместо \d+ стоит число, но если там стоят буквы, то в лог выводится полностью весь входящий пакет, как сделать чтобы программа выводила в лог только то, что между <cardLeft>(\d+)</cardLeft>, даже если там значения с буквами, например b8?
Код:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 203, 100, 796, 175)
$idinput = GUICtrlCreateInput("idinput", 16, 8, 81, 21)
$authinput = GUICtrlCreateInput("authinput", 16, 32, 81, 21)
$Button1 = GUICtrlCreateButton("Button1", 16, 56, 81, 25)
$Edit1 = GUICtrlCreateEdit("", 104, 8, 89, 81)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		case $Button1
			$hren = _hren()
			GUICtrlSetData($Edit1, $hren)

	EndSwitch
WEnd
Func _hren()
	$ID = GUICtrlRead($idinput)
	$Auth = GUICtrlRead($authinput)
	$URL = "http://109.234.155.196/prison/universal.php?cardGamePlay"
            $PostData = "sig=fe015d0685a3aab991f3c6c4e29e7612&user="& $ID &"&key="& $Auth &"&method=cardGamePlay"
            $oHTTP = ObjCreate("WinHttp.WinHttpRequest.5.1")
            $oHTTP.Open("POST", $URL)
			$oHTTP.setTimeouts(5000, 5000, 10000, 10000)
            $oHTTP.SetRequestHeader("Content-Type","application/x-www-form-urlencoded")
            $oHTTP.Send($PostData)
        $oHTTP.WaitForResponse
        $Response = $oHTTP.ResponseText
			$sMessage = StringRegExpReplace($Response, '(?s).*?<cardLeft>(\d+)</cardLeft>?.*', '\1')
			If Not $sMessage Then Return -1
    Return $sMessage
	EndFunc
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
andreitrane
Попробуйте заменить (\d+) на (.*?)
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
andreitrane
Кусок текста покажите.
Можно еще попробовать вставить
Код:
;...
$Response = $oHTTP.ResponseText
$Response = BinaryToString($Response)
;...
 

dwerf

Использует ArchLinux
Сообщения
478
Репутация
219
andreitrane сказал(а):
как сделать чтобы программа выводила в лог только то, что между <cardLeft>(\d+)</cardLeft>, даже если там значения с буквами, например b8?

Читать здесь.
Вариант для ленивых: вместо \d+ написать все знаки которые там могут быть в квадратных скобках, сзади дописать +?

Код:
$sMessage = StringRegExpReplace($Response, '(?s<cardLeft>([abcdefg...]+?)</cardLeft>?.*', '\1')
 
Автор
A

andreitrane

Новичок
Сообщения
141
Репутация
3
Кусок текста покажите
ну вот как бы весь пакет, который приходит при отправке запроса, кста значения между сardleft и cardright меняются каждый день или в зависимости от запроса
Код:
<?xml version="1.0" encoding="UTF-8"?>
<data>
    <result>0</result>
    <gameCount>77</gameCount>
    <game>
        <cardLeft>b8</cardLeft>
        <cardRight>h4</cardRight>
        <cheatsLeft>4</cheatsLeft>
    </game>
</data>
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
andreitrane
У меня работает:
Код:
#include <Array.au3>

Dim $aWhatSearch[6][2] = [[5],['result'],['gameCount'],['cardLeft'],['cardRight'],['cheatsLeft']]
$hFile = FileOpen(@ScriptDir & '\1.txt', 0)
$sRead = FileRead($hFile)
FileClose($hFile)

For $i = 1 To $aWhatSearch[0][0]
	$aWhatSearch[$i][1] = StringRegExpReplace($sRead, '(?s).*?' & $aWhatSearch[$i][0] & '>(.*?)</' & $aWhatSearch[$i][0] & '?.*', '\1')
Next
_ArrayDisplay($aWhatSearch)
В файле 1.txt - Ваш текст.
 
Автор
A

andreitrane

Новичок
Сообщения
141
Репутация
3
мне вот эта строчка помогла
Код:
$Response = $oHTTP.ResponseText
$Response = BinaryToString($Response)

спасибо))
 
Верх