Просто замените /([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
Я думал, что это «* 30 секунд до марса». ;) – insertusernamehere
Lol, вы правы! –
Будете ли вы всегда в формате 'xhours' и' xmin'? –