0

文字列で使用されている分または時間を取得しようとしています。

例 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

4

3 に答える 3

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
于 2013-09-25T14:14:21.180 に答える
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"
?>

デモ

これはうまくいくでしょう










大文字の使用 (ただしなどに置き換えませんminsminutes)


または、本当に別のトークン (分から分など) に置き換えたい場合は、次を使用します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」とその他すべてが自動的に修正されます。

string(84) 「そこに着くのに 2 時間 45 分歩き、そこに着くのに 1 秒かかりました」

デモ

于 2013-09-25T14:19:45.423 に答える
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
}

?>
于 2013-09-25T13:49:42.630 に答える