Автор Тема: [RegExp] Получить часть GET ответа  (Прочитано 917 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Maildog [?]

  • Новичок
  • *
  • Сообщений: 4
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Всем доброго времени!

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

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

Код: AutoIt [Выделить]
 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) вот таким путем:

Код: AutoIt [Выделить]
 $2=StringRegExpReplace($code,".* (\d\d\d\d\d\d).*","\1")


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

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

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

Код: AutoIt [Выделить]
$idnumer=StringRegExpReplace($sGet, "..........................................(\d\d\d\d\d\d\d\d\d).*","\1")


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

Спасибо

Русское сообщество AutoIt

[RegExp] Получить часть GET ответа
« Отправлен: Август 15, 2017, 12:07:56 »

Помечен как лучший ответ пользователем Maildog Отправлен Август 15, 2017, 13:43:50

Онлайн InnI [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 3599
  • Репутация: 950
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: [RegExp] Получить часть GET ответа
« Ответ #1, Отправлен: Август 15, 2017, 13:26:49 »
Maildog
Вам нужно найти, а не заменить. Зачем вы используете StringRegExpReplace ?
Код: AutoIt [Выделить]
$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])


Оффлайн Maildog [?]

  • Новичок
  • *
  • Сообщений: 4

  • Автор темы
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: [RegExp] Получить часть GET ответа
« Ответ #2, Отправлен: Август 15, 2017, 14:05:46 »
Maildog
Вам нужно найти, а не заменить. Зачем вы используете StringRegExpReplace ?
Код: AutoIt [Выделить]
$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

Код: AutoIt [Выделить]
$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., так же пробовал так:
Код: AutoIt [Выделить]
$Read = FileReadLine('123.txt')
$sms = StringRegExp($Read, '"sms":"(\d{6})"', 1)
MsgBox(0, 'TEST', $sms)
 


Ответ тот же
« Последнее редактирование: Август 15, 2017, 14:17:16 от Maildog »

Оффлайн Garrett [?]

  • Глобальный модератор
  • *
  • Сообщений: 3999
  • Репутация: 960
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: [RegExp] Получить часть GET ответа
« Ответ #3, Отправлен: Август 15, 2017, 14:20:02 »
Maildog  [?]
Цитировать
Содержимой файла 123.txt такое же, как и в вашем посте в переменной $text
В месте с одиночными кавычками по бокам?
Код: AutoIt [Выделить]
$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])

« Последнее редактирование: Август 15, 2017, 14:34:57 от Garrett »

Скорблю и помню.




Русское сообщество AutoIt

Re: [RegExp] Получить часть GET ответа
« Ответ #3 Отправлен: Август 15, 2017, 14:20:02 »

Онлайн InnI [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 3599
  • Репутация: 950
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: [RegExp] Получить часть GET ответа
« Ответ #4, Отправлен: Август 15, 2017, 14:20:42 »
Maildog
При флаге больше нуля StringRegExp возвращает массив. Поэтому значение будет находиться в $sms[0].

Вот функция под ваш запрос
Код: AutoIt [Выделить]
$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


Оффлайн Maildog [?]

  • Новичок
  • *
  • Сообщений: 4

  • Автор темы
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: [RegExp] Получить часть GET ответа
« Ответ #5, Отправлен: Август 15, 2017, 14:25:23 »
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}


Добавлено: Август 15, 2017, 14:28:05
Maildog
При флаге больше нуля StringRegExp возвращает массив. Поэтому значение будет находиться в $sms[0].

Вот функция под ваш запрос
Код: AutoIt [Выделить]
$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 [?]

  • Глобальный модератор
  • *
  • Сообщений: 3999
  • Репутация: 960
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: [RegExp] Получить часть GET ответа
« Ответ #6, Отправлен: Август 15, 2017, 14:38:04 »
Maildog

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


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



Добавлено: Август 15, 2017, 14:39:38
Maildog  [?]
Цитировать
Но при считывания с файла, первые 2 значения считывает (id и karma), а на sms выдает null
Пример от InnI отрабатывает полностью.

Онлайн InnI [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 3599
  • Репутация: 950
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: [RegExp] Получить часть GET ответа
« Ответ #7, Отправлен: Август 15, 2017, 15:02:45 »
Maildog
Цитировать
на sms выдает null
Значит, там так и записано ... "sms":"null", ...

Русское сообщество AutoIt

Re: [RegExp] Получить часть GET ответа
« Ответ #7 Отправлен: Август 15, 2017, 15:02:45 »

Оффлайн Maildog [?]

  • Новичок
  • *
  • Сообщений: 4

  • Автор темы
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: [RegExp] Получить часть GET ответа
« Ответ #8, Отправлен: Август 15, 2017, 17:40:20 »
Разобрался, все работает (пока что)), всем спасибо!  :beer:

Русское сообщество AutoIt

Re: [RegExp] Получить часть GET ответа
« Ответ #8 Отправлен: Август 15, 2017, 17:40:20 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
6 Ответов
4514 Просмотров
Последний ответ Апрель 29, 2010, 15:33:20
от CreatoR
15 Ответов
6545 Просмотров
Последний ответ Декабрь 29, 2010, 18:57:43
от CreatoR
4 Ответов
2579 Просмотров
Последний ответ Март 15, 2012, 21:38:35
от yuran2
3 Ответов
5669 Просмотров
Последний ответ Март 25, 2012, 01:22:03
от asdf8
14 Ответов
6011 Просмотров
Последний ответ Июль 03, 2012, 00:48:36
от Garrett
2 Ответов
2526 Просмотров
Последний ответ Февраль 02, 2013, 13:25:03
от Zaramot
2 Ответов
1946 Просмотров
Последний ответ Март 23, 2013, 21:34:18
от gregaz
6 Ответов
2347 Просмотров
Последний ответ Сентябрь 24, 2013, 20:51:34
от Merovingien
5 Ответов
3652 Просмотров
Последний ответ Октябрь 10, 2013, 21:31:28
от Garrett
2 Ответов
1731 Просмотров
Последний ответ Март 16, 2017, 01:14:10
от Skif_off