Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Тексты > разбор строки


Автор: alligator 14.7.2006, 18:11
есть текст
PING ya.ru (213.180.204.8) 56(84) bytes of data.
64 bytes from ya.ru (213.180.204.8): icmp_seq=1 ttl=59 time=1.16 ms

--- ya.ru ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 1.166/1.166/1.166/0.000 ms

из него нужно получить 
1.166
делаю так
preg_match("/mdev\s+\W+([\d*\.\d*]+)/im",$output,$res);
результатом получаеться
Array ( [0] => mdev = 1.166 [1] => 1.166 ) 
подскажите как сделать чтобы результатом был только один элемент массива.... ? 

Автор: ZlojEzh 14.7.2006, 19:42
насколько я знаю - никак
нулевым элементом всегда идет полное совпадение шаблона

но я не могу представить себе ситуацию, когда это создает проблемы...
какая разница, что писать: $output или $output[1]?..
в крайнем случае появится одна лишняя строчка и одна временная переменная
 

Автор: vasac 14.7.2006, 19:54
А вообще:
Код

$A = explode( 'mdev = ', $output );
print intval( $A[ 1 ] );
 

Автор: alligator 14.7.2006, 19:59
Цитата(ZlojEzh @  14.7.2006,  20:42 Найти цитируемый пост)
насколько я знаю - никак
нулевым элементом всегда идет полное совпадение шаблона

спасибо 

Автор: MPx 27.7.2006, 01:50
Вставляй перед условием ?:, тогда идти в массив не будет. 

Код

preg_match_all("/dqwdwqdw(?:.+?)dwqdww(.+?)/",$out,$res);


в массив пойдёт только условие (.+?) 

Автор: AztEK 27.7.2006, 08:09
Привязались вы к эти регуляркам... Мне вот нравится ф-ция sscanf() smile
Код

$string = <<<TEXT
--- ya.ru ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 1.166/1.166/1.166/0.000 ms
TEXT;

$scan = <<<TEXT
--- ya.ru ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = %s/%s/%s/0.000 ms
TEXT;

sscanf($string, $scan, $a1, $a2, $a3);
//$a1 == '1.166';
//$a2 == '1.166';
//$a3 == '1.166';
  

Автор: GiV 27.7.2006, 11:56
Цитата(AztEK @  27.7.2006,  08:09 Найти цитируемый пост)
Привязались вы к эти регуляркам... Мне вот нравится ф-ция sscanf()

А по скорости? =) 

Автор: AztEK 27.7.2006, 12:13
Думаю, регулярка проиграет smile Но можно проверить smile 

Автор: GiV 27.7.2006, 12:27
А если строка сменится на 
4 packets transmitted, 0 received, 100% packet loss, time 0ms

Шаблон сканирования сработает? =)

 

Автор: AztEK 27.7.2006, 18:00
Нет. А регулярка? =) 

Автор: GiV 27.7.2006, 19:27
100% сработает =] 

Автор: AztEK 28.7.2006, 07:01
Оу... До меня дошло.
Да, в этом случае регулярки, возможно предпочтительнее smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)