Что нового

[RegExp] Получить часть GET ответа

Maildog

Новичок
Сообщения
4
Репутация
0
Всем доброго времени!

На моем пути в этом чудесном языке программирования возникла проблема.
И так, докладываю ситуацию:

Получаю ответ через api от сервера таким образом (все работает, тут проблем нет, ответ пишет в переменную):

Код:
Global $code = HttpGet("http://example.com/api.php?metod=get_code&apikey=123")


Ответ получаю в виде:

{"response":"1","number":"1234567890","id":10673797,"text":"Your Google verification code is 976497","extra":"0","karma":30.05,"pass":"","sms":"976497","balanceOnPhone":0}

Пробую вытащить сам нужный код верификации (в данном случае 976497) вот таким путем:

Код:
$2=StringRegExpReplace($code,".* (\d\d\d\d\d\d).*","\1")


Но, в переменной $2 вместо нужного кода получаю в ответ значение $code либо 1 :scratch:

Вопрос: Как вытащить из ответа, возможно посредством RegExp, код подтверждения?
И удачненько его так записать в какую то $yescode

Утром работала вот такая методика, но почему то тоже перестала записывать нужное значение (не код, а айди например) и все полетело :stars:

Код:
$idnumer=StringRegExpReplace($sGet, "..........................................(\d\d\d\d\d\d\d\d\d).*","\1")


Так же подходил к этому так - записывал ответ в файл, с него удалял все скобки, и потом через StringRegExpReplace "посимвольно" считал где код. Но по моему, есть менее извращенные пути.

Спасибо
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Maildog
Вам нужно найти, а не заменить. Зачем вы используете StringRegExpReplace ?
Код:
$text = '{"response":"1","number":"1234567890","id":10673797,"text":"Your Google verification code is 976497","extra":"0","karma":30.05,"pass":"","sms":"976497","balanceOnPhone":0}'
$sms = StringRegExp($text, '"sms":"(\d{6})"', 1)
If Not @error Then MsgBox(0, "sms", $sms[0])
 
Автор
M

Maildog

Новичок
Сообщения
4
Репутация
0
InnI сказал(а):
Maildog
Вам нужно найти, а не заменить. Зачем вы используете StringRegExpReplace ?
Код:
$text = '{"response":"1","number":"1234567890","id":10673797,"text":"Your Google verification code is 976497","extra":"0","karma":30.05,"pass":"","sms":"976497","balanceOnPhone":0}'
$sms = StringRegExp($text, '"sms":"(\d{6})"', 1)
If Not @error Then MsgBox(0, "sms", $sms[0])

Вооот, это то что нужно! Огромное спасибо!
Пример работает волшебно, но когда я пытаюсь найти тот же код допустим в файле, то ответа нет. Где я допустил глупую ошибку? (чувствую прям, где то не хватает точки или скобки, это у меня в крови))
Содержимой файла 123.txt такое же, как и в вашем посте в переменной $text

Код:
$i = FileOpen("123.txt")
$text = FileRead($i)
$sms = StringRegExp($text, '"sms":"(\d{6})"', 1)
If Not @error Then MsgBox(0, "sms", $sms)

Ответ:
>Exit code: 0 Time: 0.08035

upd., так же пробовал так:
Код:
$Read = FileReadLine('123.txt') 
$sms = StringRegExp($Read, '"sms":"(\d{6})"', 1)
MsgBox(0, 'TEST', $sms)

Ответ тот же
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Maildog [?]
Содержимой файла 123.txt такое же, как и в вашем посте в переменной $text
В месте с одиночными кавычками по бокам?
Код:
$i = FileOpen("123.txt")
$text = FileRead($i)
ConsoleWrite($text)
$sms = StringRegExp($text, '"sms":"(\d{6})"', 1)
If Not @error Then MsgBox(0, "sms", $sms[0])
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Maildog
При флаге больше нуля StringRegExp возвращает массив. Поэтому значение будет находиться в $sms[0].

Вот функция под ваш запрос
Код:
$text = '{"response":"1","number":"1234567890","id":10673797,"text":"Your Google verification code is 976497","extra":"0","karma":30.05,"pass":"","sms":"976497","balanceOnPhone":0}'
;~ $text = FileRead("123.txt")

MsgBox(0, "", GetValue($text, "id"))
MsgBox(0, "", GetValue($text, "karma"))
MsgBox(0, "", GetValue($text, "sms"))

Func GetValue($sText, $sParam)
  Local $sValue = StringRegExp($sText, '"' & $sParam & '":(.*?)[,}]', 1)
  If @error Then Return SetError(@error, @extended, "")
  Return StringReplace($sValue[0], '"', '')
EndFunc
 
Автор
M

Maildog

Новичок
Сообщения
4
Репутация
0
Garrett сказал(а):
Maildog [?]
Содержимой файла 123.txt такое же, как и в вашем посте в переменной $text
В месте с одиночными кавычками по бокам?

Нет, с {

Код:
{"response":"1","number":"0963010737","id":10673797,"text":"Your Google verification code is 976497","extra":"0","karma":30.05,"pass":"","sms":"976497","balanceOnPhone":0}



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

InnI сказал(а):
Maildog
При флаге больше нуля StringRegExp возвращает массив. Поэтому значение будет находиться в $sms[0].

Вот функция под ваш запрос
Код:
$text = '{"response":"1","number":"1234567890","id":10673797,"text":"Your Google verification code is 976497","extra":"0","karma":30.05,"pass":"","sms":"976497","balanceOnPhone":0}'
;~ $text = FileRead("123.txt")

MsgBox(0, "", GetValue($text, "id"))
MsgBox(0, "", GetValue($text, "karma"))
MsgBox(0, "", GetValue($text, "sms"))

Func GetValue($sText, $sParam)
  Local $sValue = StringRegExp($sText, '"' & $sParam & '":(.*?)[,}]', 1)
  If @error Then Return SetError(@error, @extended, "")
  Return StringReplace($sValue[0], '"', '')
EndFunc

Очень полезный пример! Но при считывания с файла, первые 2 значения считывает (id и karma), а на sms выдает null
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Maildog

Предупреждение За нарушение общих правил (пункт В.2):
Старайтесь избегать “Over quoting” (преувеличенное цитирование) - цитируйте только необходимую часть сообщения, которая наилучшим образом подчеркнёт суть цитируемого.


С уважением, ваш Глобальный модератор.







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

Maildog [?]
Но при считывания с файла, первые 2 значения считывает (id и karma), а на sms выдает null
Пример от InnI отрабатывает полностью.
 
Автор
M

Maildog

Новичок
Сообщения
4
Репутация
0
Разобрался, все работает (пока что)), всем спасибо! :beer:
 
Верх