簡體   English   中英

PHP preg_match 問題

[英]PHP preg_match problems

preg_match 似乎以極其不方便的方式實現。 如果我使用組並且並非所有組都在特定字符串上產生匹配項,那么將減少數組計數,而不是返回一個匹配數組,包括空條目(null 或 '')。 這似乎與 PHP 文檔指出它返回一個空字符串(或帶有標志的空值)不一致。 如果問號跟在組后面,則僅保證匹配數組元素(為空或其他),但這並不總是需要的。

考慮:

'/^((\d{1,2}):)?(\d{1,2})(\.(\d{1,2}))?$/'

無條件嵌套組根本不參與匹配數組,甚至沒有 null 或 '' 如果我使嵌套組有條件,這將不希望地改變語義。

當簡化以避免這種情況時(然后我可以對組值進行后處理,以消除不需要的字符):

'/^(\d{1,2}:)?(\d{1,2})(\.\d{1,2})?$/'

仍然存在問題,因為由於某種原因,最后一個條件組未能在匹配數組中生成空條目。

我正在嘗試以 hrs:mins.secs 為單位驗證和格式化鍛煉的持續時間 這匹配:x(x 分鍾)x:y(x 小時和 y 分鍾 x:yz(x 小時、y 分鍾和 z 秒)xy( x 分和 y 秒)和其他格式失敗,這很好。

只是似乎沒有一種方便的方法來獲取每個組匹配並使用它來生成標准格式的持續時間字符串。

缺少的鍵可能是優化。 模式的一部分甚至可能不會被執行。

但是命名組是可能的,您可以格式化模式:

$pattern = "(
  ^
  (?:(?<hours>\d{1,2}):)?
  (?<minutes>\d{1,2})
  (?:\.(?<seconds>\d{1,2}))?
  $
)Dx";

$data = [
  '42', '21:42', '21:42.1'
];

foreach ($data as $subject) {
    if (preg_match($pattern, $subject, $matches)) {
        var_dump(
            [
                'hours' => (int)($matches['hours'] ?? 0),
                'minutes' => (int)($matches['minutes'] ?? 0),
                'seconds' => (int)($matches['seconds'] ?? 0)   
            ]
        );
    }
}

Output:

array(3) {
  ["hours"]=>
  int(0)
  ["minutes"]=>
  int(42)
  ["seconds"]=>
  int(0)
}
array(3) {
  ["hours"]=>
  int(21)
  ["minutes"]=>
  int(42)
  ["seconds"]=>
  int(0)
}
array(3) {
  ["hours"]=>
  int(21)
  ["minutes"]=>
  int(42)
  ["seconds"]=>
  int(1)
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM