Что нового

[RegExp] Как правильно обработать ошибку StringRegExpReplace ?

ivsatel

Продвинутый
Сообщения
319
Репутация
84
Здравствуйте.
Использую AutoIt 3.3.8.1

Помогите обработать ошибку
Код:
StringRegExpReplace
при не нахождении шаблона.
Код:
;Удалить все + удалить файлы и настройки сохраненные дополнениями:
RunWait('RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 4351')

Sleep(3000)

Global $aInfoTrack[1], $aGetInfoTrack[14]
;##########################		Запрос страницы
;$sInfoTrackInetRead = InetRead('http://f1.101.ru/api/getplayingtrackinfo.php?station_id=18&short=1&typechannel=channel')
$sInfoTrackInetRead = InetRead('http://f1.101.ru/api/getplayingtrackinfo.php?station_id=18')

If $sInfoTrackInetRead = '' Then
	SetError(100, 'ERROR', 'ERROR')
	MsgBox(1, 'Error', @error)
	Exit
EndIf
;##########################		Запрос страницы

;##########################		Перекодиовка страницы
$sInfoTrackBinaryToString = BinaryToString($sInfoTrackInetRead)

If $sInfoTrackBinaryToString = '' Then
	SetError(101, 'ERROR', 'ERROR')
	MsgBox(1, 'Error', @error)
	Exit
EndIf
;##########################		Перекодиовка страницы

;##########################		Заданные паттерны
$aGetInfoTrack[0] = '.*?"server"[\:]"(.*?)"[\,].*'	; Server - Сервер вещания
$aGetInfoTrack[1] = '.*?"title"[\:]"(.*?)"[\,].*'	; Title - Название трека 1
$aGetInfoTrack[2] = '.*?"id"[\:]"(.*?)"[\,].*'	; ID - Идентификатор
$aGetInfoTrack[3] = '.*?"start[\_]time"[\:]"(.*?)"[\,].*'	; Start - Старт воспроизведения
$aGetInfoTrack[4] = '.*?"finish[\_]time"[\:](.*?)[\,].*'	; Finish - Конец воспроизведения
$aGetInfoTrack[5] = '.*?"end[\_]time"[\:](.*?)[\,].*'	; EndTime - Конец воспроизведения
$aGetInfoTrack[6] = '.*?"query[\_]time"[\:](.*?)[\,].*'	; QueryTime - Запрашиваемое (установленное) время воспроизведения
$aGetInfoTrack[7] = '.*?"sample"[\:]"(.*?)".*'	; Sample - Адрес воспроизводимого трека
$aGetInfoTrack[8] = '.*?"track[\_]title"[\:]"(.*?)"[\,].*'	; Track Title - Название трека 2
$aGetInfoTrack[9] = '.*?"executor[\_]title"[\:]"(.*?)"[\,].*'	; Album Track Title - Название альбома
$aGetInfoTrack[10] = '.*?"trackTimeMillis"[\:](.*?)[\,].*'	; Track Time (ms) - Время трека в милисекундах (осуществляется перевод в минуты)
$aGetInfoTrack[11] = '.*?"trackName"[\:]"(.*?)"[\,].*'	; Track Name - Имя трека из базы или по тэгам
$aGetInfoTrack[12] = '.*?"collectionName"[\:]"(.*?)"[\,].*'	; Collection Name - Имя используюемое в коллекции
$aGetInfoTrack[13] = '.*?"artistViewUrl"[\:]"(.*?)"[\,].*'	; Artist View Url - Адрес странички артиста в itunes.apple.com
;##########################		Заданные паттерны

;##########################		Обработка полученой страницы заданными паттернами
For $i = 0 To UBound($aGetInfoTrack)-1
	ReDim $aInfoTrack[$i + 1]
	If $i = 6 Then
		$aInfoTrack[$i] = StringRegExpReplace($sInfoTrackBinaryToString, '(?i)'&$aGetInfoTrack[$i], '$1')
		If @error = 2 Then $aInfoTrack[$i] = 'ERROR'
		If $aInfoTrack[$i] = '' Then $aInfoTrack[$i] = 'ERROR'
	EndIf
	If $i = 7 Then
		$aInfoTrack[$i] = StringRegExpReplace(StringRegExpReplace($sInfoTrackBinaryToString, '(?i)'&$aGetInfoTrack[$i], '$1'), '[\\]', '')
		If @error = 2 Then $aInfoTrack[$i] = 'ERROR'
		If $aInfoTrack[$i] = '' Then $aInfoTrack[$i] = 'ERROR'
	EndIf
	If $i = 10 Then
		$aInfoTrack[$i] = Round((StringRegExpReplace($sInfoTrackBinaryToString, '(?i)'&$aGetInfoTrack[$i], '$1') / 1000) / 60, 2)&' Min'
		If @error = 2 Then $aInfoTrack[$i] = 'ERROR'
		If $aInfoTrack[$i] = '' Then $aInfoTrack[$i] = 'ERROR'
	EndIf
	If $i = 13 Then
		$aInfoTrack[$i] = StringRegExpReplace(StringRegExpReplace($sInfoTrackBinaryToString, '(?i)'&$aGetInfoTrack[$i], '$1'), '[\\]', '')
		If @error = 2 Then $aInfoTrack[$i] = 'ERROR'
		If $aInfoTrack[$i] = '' Then $aInfoTrack[$i] = 'ERROR'
	EndIf
	If $i <> 13 And $i <> 10 And $i <> 7 And $i <> 6 Then
		$aInfoTrack[$i] = StringRegExpReplace($sInfoTrackBinaryToString, '(?i)'&$aGetInfoTrack[$i], '$1')
		If @error = 2 Then $aInfoTrack[$i] = 'ERROR'
		If $aInfoTrack[$i] = '' Then $aInfoTrack[$i] = 'ERROR'
	EndIf
Next
;##########################		Обработка полученой страницы заданными паттернами

If Not IsArray($aInfoTrack) Then
	SetError(102, 'ERROR', 'ERROR')
	MsgBox(1, 'Error', @error)
	Exit
EndIf

;##########################		Вывод результата в консоль
For $i = 0 To UBound($aGetInfoTrack)-1
	ConsoleWrite($i&' = '&$aInfoTrack[$i]&@LF)
Next
;##########################		Вывод результата в консоль
К примеру, если 11, 12 и 13-й параметр не передается сервером то ячейки заполняются целой строкой. Как этого избежать?
Код:
--> Press Ctrl+Alt+F5 to Restart or Ctrl+Break to Stop
0 = 172.17.255.130
1 = MICHAEL, Justin - Eyes Closed (feat. AJ from Saint Motel, Jerome Isma-Ae rmx)
2 = 199538
3 = 1382465859
4 = 1382466226
5 = 291
6 = 1382465935
7 = http://wz5.101.ru/full/18/199538.mp3
8 = Eyes Closed (feat. AJ from Saint Motel, Jerome Isma-Ae rmx)
9 = MICHAEL, Justin
10 = 0 Min
11 = {"status":0,"result":{"duration_sec":"367","title":"MICHAEL, Justin - Eyes Closed (feat. AJ from Saint Motel, Jerome Isma-Ae rmx)","id":"199538","start_time":"1382465859","finish_time":1382466226,"mdb_idtrack":"128421","mdb_idexecutor":"20783","mdb_retry":"0","module":"channel","itunes":"","track_title":"Eyes Closed (feat. AJ from Saint Motel, Jerome Isma-Ae rmx)","executor_title":"MICHAEL, Justin","end_time":291,"query_time":1382465935,"server":"172.17.255.130","sample":"http:\/\/wz5.101.ru\/full\/18\/199538.mp3"},"errorCode":0,"errorMsg":""}
12 = {"status":0,"result":{"duration_sec":"367","title":"MICHAEL, Justin - Eyes Closed (feat. AJ from Saint Motel, Jerome Isma-Ae rmx)","id":"199538","start_time":"1382465859","finish_time":1382466226,"mdb_idtrack":"128421","mdb_idexecutor":"20783","mdb_retry":"0","module":"channel","itunes":"","track_title":"Eyes Closed (feat. AJ from Saint Motel, Jerome Isma-Ae rmx)","executor_title":"MICHAEL, Justin","end_time":291,"query_time":1382465935,"server":"172.17.255.130","sample":"http:\/\/wz5.101.ru\/full\/18\/199538.mp3"},"errorCode":0,"errorMsg":""}
13 = {"status":0,"result":{"duration_sec":"367","title":"MICHAEL, Justin - Eyes Closed (feat. AJ from Saint Motel, Jerome Isma-Ae rmx)","id":"199538","start_time":"1382465859","finish_time":1382466226,"mdb_idtrack":"128421","mdb_idexecutor":"20783","mdb_retry":"0","module":"channel","itunes":"","track_title":"Eyes Closed (feat. AJ from Saint Motel, Jerome Isma-Ae rmx)","executor_title":"MICHAEL, Justin","end_time":291,"query_time":1382465935,"server":"172.17.255.130","sample":"http://wz5.101.ru/full/18/199538.mp3"},"errorCode":0,"errorMsg":""}
+>22:18:54 AutoIt3.exe ended.rc:0
Повторюсь, "ошибка" появляется только при отсутствии передачи 11, 12 и 13 параметров.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
ivsatel
Я бы вам посоветовал с JSON работать не с помощью регулярок, а с этой библиотекой.


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

Библиотека испытана неоднократно, проверено :smile:
Вот пару примеров если будет желание изучать:
Код:
#include 'JSMN.au3'
#include <array.au3>

$sURL = 'http://f1.101.ru/api/getplayingtrackinfo.php?station_id=18'
$sD = BinaryToString(InetRead($sURL))

$oJSON = Jsmn_Decode($sD)

$vStatus = Jsmn_ObjGet($oJSON, 'status')
ConsoleWrite('> Статус: ' & $vStatus & @LF)


$oResult = Jsmn_ObjGet($oJSON, 'result')
$vTitle = Jsmn_ObjGet($oResult, 'title')
ConsoleWrite($vTitle & @LF)

$aItunes = Jsmn_ObjGet($oResult, 'itunes')
For $i = 0 To UBound($aItunes) - 1
	$a2D = Jsmn_ObjTo2DArray($aItunes[$i])
	_ArrayDisplay($a2D, 'itunes[' & $i & ']')
Next

$vTrackCensoredName = Jsmn_ObjGet($aItunes[0], 'trackCensoredName')
ConsoleWrite($vTrackCensoredName & @LF)
 

sngr

AutoIT Гуру
Сообщения
1,010
Репутация
408
Надо не @error проверять, а @extended.
 
Автор
I

ivsatel

Продвинутый
Сообщения
319
Репутация
84
inververs
inververs сказал(а):
Вот пару примеров если будет желание изучать:
Спасибо. Попробую обязательно.
sngr
sngr сказал(а):
Надо не @error проверять, а @extended.
Другими словами если я правильно понял, то мне нужно делать так:
Код:
For $i = 0 To UBound($aGetInfoTrack)-1
	ReDim $aInfoTrack[$i + 1]
	If $i = 6 Then
		$aInfoTrack[$i] = StringRegExpReplace($sInfoTrackBinaryToString, '(?i)'&$aGetInfoTrack[$i], '$1')
		If @extended <> 1 Then $aInfoTrack[$i] = 'ERROR'
	EndIf
	If $i = 7 Then
		$aInfoTrack[$i] = StringRegExpReplace(StringRegExpReplace($sInfoTrackBinaryToString, '(?i)'&$aGetInfoTrack[$i], '$1'), '[\\]', '')
		If @extended <> 1 Then $aInfoTrack[$i] = 'ERROR'
	EndIf
	If $i = 10 Then
		$aInfoTrack[$i] = Round((StringRegExpReplace($sInfoTrackBinaryToString, '(?i)'&$aGetInfoTrack[$i], '$1') / 1000) / 60, 2)&' Min'
		If @extended <> 1 Then $aInfoTrack[$i] = 'ERROR'
	EndIf
	If $i = 13 Then
		$aInfoTrack[$i] = StringRegExpReplace(StringRegExpReplace($sInfoTrackBinaryToString, '(?i)'&$aGetInfoTrack[$i], '$1'), '[\\]', '')
		If @extended <> 1 Then $aInfoTrack[$i] = 'ERROR'
	EndIf
	If $i <> 13 And $i <> 10 And $i <> 7 And $i <> 6 Then
		$aInfoTrack[$i] = StringRegExpReplace($sInfoTrackBinaryToString, '(?i)'&$aGetInfoTrack[$i], '$1')
		If @extended <> 1 Then $aInfoTrack[$i] = 'ERROR'
	EndIf
Next

Т.е. Звучит так, если количество замен (т.к. @extended содержит количество замен) не равно единице...
Но как быть если позиция символа совпадет...
Что-то я запутался(
 

sngr

AutoIT Гуру
Сообщения
1,010
Репутация
408
Код:
If @extended=0 Then $aInfoTrack[$i] = 'ERROR'

Если рег выражение совпало, в $aInfoTrack[$i] вернётся результат рег выражения, @extended>0; в иных случаях в $aInfoTrack[$i] вернётся вся строка, @extended=0.
 
Верх