Что нового

[RegExp] Получение IP-адреса из строки

r35p3ct

Продвинутый
Сообщения
228
Репутация
60
Насчет табов еще точно не знаю, пока парсю сохраненную страницу, на работе буду проверять, что выдаст _INetGetSource.
Только вот начал разбираться с StringRegExp, CreatoR, подскажи как вырезать из строки IP, мне кажется можно как то по другому....
Код:
$b='        <a href="http://xxx.ru/ip=192.68.1.2">192.68.1.2</a>'
$IPtmp=StringRegExp($b, "\>.*\<", 1)
$IP=StringRegExpReplace($MODIPtmp[0],'[><]','')
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Вот функция для получения массива со всеми IP из строки:

Код:
#include <Array.au3>

$b = '        <a href="http://xxx.ru/ip=192.68.1.2">192.68.1.2</a>'
$IPsArray = _StringToIPArray($b)
_ArrayDisplay($IPsArray)

Func _StringToIPArray($sString)
	Local $avArray = StringRegExp($sString, '([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})', 3)
	Local $avRetArr[UBound($avArray)+1], $iUbound
	
	For $i = 0 To UBound($avArray)-1
		If _StringIsValidIP($avArray[$i]) Then
			$avRetArr[0] += 1
			$avRetArr[$avRetArr[0]] = $avArray[$i]
		EndIf
	Next
	
	If $avRetArr[0] = 0 Then Return SetError(1, 0, 0)
	
	ReDim $avRetArr[$avRetArr[0]+1]
	Return $avRetArr
EndFunc

Func _StringIsValidIP($sIP_String, $iRet_Flag=-1)
	If $iRet_Flag <> -1 Then Return StringRegExp($sIP_String, '\A([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})\z')
	
	Return StringRegExpReplace($sIP_String, '([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}).*', '\1')
EndFunc
 
Автор
R

r35p3ct

Продвинутый
Сообщения
228
Репутация
60
Отлично, только вот есть ли смысл прогонять весь массив, если известна строка содержащая ИП?
А можешь переделать для поиска мак адреса?
<td>1,6,00:1a:ad:77:30:de</td> на выходе нужен 00:1a:ad:77:30:de
PS Вообще задача стоит спарсить с сайта пару айпишников и маков и строчку с текстом.
UPD:
Получилось так:
Код:
$b = '        <td>1,6,00:aa:a2:2a:30:de</td>'
$MAC= StringRegExp($b, '([\dabcdef]{2}\:[\dabcdef]{2}\:[\dabcdef]{2}\:[\dabcdef]{2}\:[\dabcdef]{2}\:[\dabcdef]{2})', 1)
ConsoleWrite('MAC: '&$MAC[0]&@LF)

хотя вроде должно работать так:
Код:
$MAC = StringRegExp($b, '([\d\a]{2}\:[\d\a]{2}\:[\d\a]{2}\:[\d\a]{2}\:[\d\a]{2}\:[\dabcdef]{2})', 1)

или
Код:
$MAC = StringRegExp($b, '([\x]{2}\:[\x]{2}\:[\x]{2}\:[\x]{2}\:[\x]{2}\:[\x]{2})', 1)

но не работает почему то.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
r35p3ct [?]
есть ли смысл прогонять весь массив, если известна строка содержащая ИП?
Можно и так:

Код:
$b = '        <a href="http://xxx.ru/ip=192.68.1.2">192.68.1.2</a>'
$IP = StringRegExpReplace($b, '.*ip=(.*?)">.*', '\1')

ConsoleWrite($IP & @CRLF)
 
Сообщения
28
Репутация
-3
я свой ip узнаю из checkip.dyndns.com , там так же скачивается HTML код , я его вот атк выделяю

Код:
$b = '        <a href="http://xxx.ru/ip=192.68.1.2">192.68.1.2</a>'
$b=stringSplit($b,">")
$b=$b[ $b[0]-1 ] ; получаем кусок 192.68.1.2</a
$b=$b=stringSplit($b,"<")
$b=$b[ 1 ] ; получаем 192.68.1.2
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Core2Duo [?]
я свой ip узнаю из checkip.dyndns.com
А чем не угодила серия макросов @IPAddress?

я его вот атк выделяю
Зачем такие сложности, тем более в скрипте ошибка. Если не через RegExp, то лучше так:

Код:
$sStr = '        <a href="http://xxx.ru/ip=192.68.1.2">192.68.1.2</a>'

$iStart = StringInStr($sStr, '>', 0, -2) + 1
$iLenght = StringInStr($sStr, '<', 0, -1) - $iStart

$sStr = StringMid($sStr, $iStart, $iLenght)

ConsoleWrite($sStr & @CRLF)
 

amel27

Продвинутый
Сообщения
146
Репутация
55
r35p3ct сказал(а):
но не работает почему то.
тогда уж так:
Код:
#include <array.au3>

$b = '        <td>1,6,00:aa:a2:2a:30:de</td>'
$a = StringRegExp($b, "[^:]([[:xdigit:]]{2}(?::[[:xdigit:]]{2}){5})[^:]", 3)

_ArrayDisplay($a)
 
Верх