文字列を時刻に分解するとき、やり方は色々ありますし、ライブラリもいっぱい見つかると思いますが、正規表現だけでも基本的なことはできますね。
たとえばこんな書き方は簡単でわかりやすいです。
preg_match('/((\d+)時間)?((\d+)分)?((\d+)秒)?/',
'2時間53分14秒', $match);
print_r($match);
/*
Array
(
[0] => 2時間53分14秒
[1] => 2時間
[2] => 2
[3] => 53分
[4] => 53
[5] => 14秒
[6] => 14
)
*/
これだと、53分14秒や2時間14秒のように前/途中が無いときにも、勝手に詰められてしまうことも無くて扱いやすいです。
正規表現さえ使えればライブラリに依存しないので、とっさな時も大丈夫ですね。
同僚がもっとスマートな正規表現を教えてくれましたが、たぶんこちらの方がわかりやすい。