Помощь при разборе форматированной строки - PullRequest
1 голос
/ 26 марта 2011

У меня есть строки:

17s 283ms
48s 968ms

Строковые значения никогда не совпадают, и я хочу извлечь из него «второе» значение.В данном случае, 17 и 48.

Я не очень хорошо разбираюсь в регулярных выражениях, поэтому я сделал обходной путь:

$str = "17s 283ms";    
$split_str = explode(' ', $str);

foreach($split_str as $val){
    if(strpos($val, 's') !== false) $sec = intval($val);
}

Проблема в том, что персонаж 's' существует как в split_str [0], так и в split_str [1], поэтому моя переменная $ sec продолжает получать 283 вместо 17.

Опять же, я не очень хорошо разбираюсь в регулярных выражениях,и я почти уверен, что регулярное выражение - это путь в этом случае.Пожалуйста помогите.Спасибо.

Ответы [ 5 ]

6 голосов
/ 26 марта 2011

Вам даже не нужно использовать регулярное выражение для этого.

$seconds = substr($str, 0, strspn($str, '1234567890'));

Приведенное выше решение извлечет все цифры из начала строки.Не имеет значения, является ли первый нецифровый символ "s", пробел или что-то еще.

Но зачем?

Вы даже можете просто привести $str к int:

$seconds = (int)$str; // equivalent: intval($str)

См. Это в действии .

Регулярные выражения являются определенным излишним для такой простой задачи.Не используйте динамит для сверления отверстий в стене.

4 голосов
/ 26 марта 2011

Вы можете сделать это так:

preg_match('/(?<seconds>\d+)s\s*(?<milliseconds>\d+)ms/', $var, $matches);

print_r($matches);
1 голос
/ 26 марта 2011

Если строка всегда будет отформатирована таким образом, вы можете просто использовать:

<?php
    $timeString = '17s 283ms';
    $seconds = substr($timeString, 0, strpos($timeString, 's')); 
?>
0 голосов
/ 26 марта 2011

(\ d + s) \ d + ms

- правильное регулярное выражение.Использование будет примерно таким:

$str = "17s 283ms";
$groups = array();
preg_match("/(\d+)s \d+ms/", $str, $groups);

Тогда ваш номер до ms будет $groups[1].

0 голосов
/ 26 марта 2011

Ну, я думаю, вы можете предположить, что секунды всегда идут раньше, чем миллисекунды. Нет необходимости в регулярном выражении, если формат соответствует. Это должно сделать это:

$parts = explode(' ', $str);
$seconds = rtrim($parts[0], 's')
echo $seconds; // 17s

Это разделит строку на пробел и займет первую часть 17s. Затем rtrim используется для удаления 's', и у вас остается 17.

...