私はこのような文字列を持っています
image/jpeg; name="3.jpg"
3.jpgPHPの正規表現で抜き出したい。私は使っている
$test='image/jpeg; name="3.jpg"';
preg_match('/^.*image\/(gif|png|jpg|jpeg|GIF|PNG|JPG|JPEG).*(name=(.+))?$/',$test, $matches);
しかし、それは名前を引き出していません。どこが間違っているのか教えてください
あなたの問題はこれです:
.*(name=(.+))?$
まず、.*文字列の最後まですべてに一致します。
では、(name=(.+))?何にもマッチできませんが、任意なのでOKです。したがって、一致は成功しましたが、何もキャプチャされていません。
/^.*image\/(?:GIF|PNG|JPG|JPEG).*?(?:name=(.+))?$/i
この場合、.*?一致する文字をできるだけ少なくすることが役立ちます。image(また、 andで大文字と小文字を区別しない限り、修飾子nameを使用して正規表現を短縮できます。)/i
ファイル名だけが必要な場合は、他のグループを非キャプチャ ( (?:...)) にすることもできます。