私は文字列(ファイル名)を持っています:s_113_2.3gp
2番目のアンダースコアの後に表示される数字を抽出するにはどうすればよいですか?この場合は' 2
'ですが、場合によっては数桁の数字になることもあります。
また、最初の下線の後に表示される桁数は変化する可能性があるため、この文字列の長さは一定ではありません。
キャプチャグループを使用できます。
preg_match('/_(\d+)\.\w+$/', $str, $matches);
$number = $matches[1];
\d+
1桁以上を表します。その周りの括弧はそれをキャプチャするので、後でそれを取得することができます$matches[1]
。エスケープする.
必要があります。エスケープしないと、改行以外の文字と一致するためです。\w+
1つ以上の単語文字(数字、文字、アンダースコア)に一致します。そして最後に、$
は文字列の終わりを表し、正規表現を「アンカー」します(そうしないと、複数を含む文字列で問題が発生します.
)。
これにより、任意のファイル拡張子も可能になります。
Ωmegaが以下で指摘するように、キャプチャグループを使用しない別の可能性があります。_
ルックアラウンドの概念を使用すると、最初と\.\w+$
最後の一致を回避できます。
preg_match('/(?<=_)\d+(?=\.\w+$)/', $str, $matches);
$number = $matches[0];
ただし、このかなり小さな最適化を適用する前に、プロファイリングをお勧めします。しかし、それは心に留めておくべきことです(というより、読み進めることです!)。
正規表現ルックアラウンドを使用すると、非常に短いコードになります。
$n = preg_match('/(?<=_)\d+(?=\.)/', $str, $m) ? $m[0] : "";
...読み取り:アンダースコアとピリオド\d+
の間にある1つ以上の数字を検索します(?<=_)
(?=\.)