2013-09-25 5 views
0

Я пытаюсь получить минуты или часы, используемые в строке.preg_match минуты и часы

Пример 1:

$string = "I walked for 2hours"; 
// preg_match here 
$output = "2 hours"; 

Пример 2:

$string = "30min to mars"; 
// preg_match here 
$output = "30 minutes"; 

Уже прочитать ниже вопрос. Но не решает мой вопрос: preg_match to find a word that ends in a certain character

+6

Я думал, что это «* 30 секунд до марса». ;) – insertusernamehere

+0

Lol, вы правы! –

+0

Будете ли вы всегда в формате 'xhours' и' xmin'? –

ответ

2
$string = "I walked for 30hours and 22min"; 

$pattern_hours = '/^.*?([0-9]+)hours.*$/'; 
echo preg_replace($pattern_hours, '${1} hours', $string),"\n"; 

$pattern_min = '/^.*?([0-9]+)min.*$/'; 
echo preg_replace($pattern_min, '${1} minutes', $string),"\n"; 

Пожалуйста, не стесняйтесь задавать вопросы. Код был протестирован в PHP 5.3 выхода:

30 hours 
22 minutes 
+0

Я просто хочу отметить, что наличие 2 'Xhours' в' $ string' выводит только первый. – Christoph

0
<?php 

$string = "I walked for 2hours and 30min"; 
$pattern_hours = '/([0-9]{0,2})hours/'; 
$pattern_min = '/([0-9]{0,2})min/'; 
if(preg_match($pattern_hours, $string, $matches, PREG_OFFSET_CAPTURE, 3)) { 
    // echo the match hours 
} elseif(preg_match($pattern_min, $string, $matches, PREG_OFFSET_CAPTURE, 3)) { 
    // echo the match minutes 
} 

?> 
+0

Должно быть '/ [0-9] {0,2} часов /' без '^' –

+0

Спасибо @LaurentWartel за исправление меня! Я изменю его :) –

+1

Кроме того, я думаю, он хочет извлечь количество часов (или минут): в этом случае он должен использовать захватывающие скобки '([0-9] {0,2}) часов. –

1

Просто замените /([0-9]+)\s*(hours?|minutes?|seconds?|mins?|secs?)/i на $1 $2:

<?php 
    $string = "I walked for 2hours and 45 mins to get there"; 

    $string = preg_replace("/([0-9]+)\s*(hours?|minutes?|seconds?|mins?|secs?)/i", "$1 $2", $string); 

    var_dump($string); 
    //string(45) "I walked for 2 hours and 45 mins to get there" 
?> 

DEMO

Это будет работать для

Час
Часы
минут
Minute
Mins
Мин
секунды
Второй
ИКС
Sec

любой капитализации (, но не заменят mins на minutes и т.д.)


С другой стороны, если вы действительно хотите, чтобы заменить различные жетоны (минут до минут и т.д.), используйте preg_replace_callback:

<?php 
    function replaceTimes($matches) { 
     $times = array(
      "hour" => array("hour"), 
      "minute" => array("min", "minute"), 
      "second" => array("sec", "second") 
     ); 

     $replacement = $matches[1] . " " . $matches[2]; 

     foreach ($times as $time => $tokens) { 
      if (in_array($matches[2], $tokens)) { 
       $replacement = $matches[1] . " " . $time . ($matches[1] != "1" ? "s" : ""); 
       break; 
      } 
     } 

     return $replacement; 
    } 

    $string = "I walked for 2hours and 45 mins to get there as well as 1 secs to get up there"; 

    $string = preg_replace_callback("/([0-9]+)\s*(hour|minute|second|min|sec)s?/i", "replaceTimes", $string); 

    var_dump($string); 
?> 

который автоматически фиксирует «s» в конце лексемы, а также все остальное :

строка (84) "Я шел в течение 2 часов и 45 минут, чтобы получить там, а также 1 секунду, чтобы получить там"

DEMO

Смежные вопросы