preg_*
系の関数(PCRE関数)のパターンはデリミタで囲む必要があります。
PHP: デリミタ - Manual
例えば、foo|bar
という正規表現を利用する場合、以下のように記述しなくてはなりません。
PHP
1preg_match_all('/foo|bar/', $str, $matches);
この場合、デリミタは/
となります。
質問の正規表現の場合、デリミタを/
にすると正規表現内で/
をエスケープする必要があるため、/
以外のデリミタを使用したほうが良いでしょう。
質問のコードを動くように修正すると、以下のようになります。
(このコードでは、デリミタとして^
を利用しています)
PHP
1$str = 'xxxxxxxxfile:"http://xxxexample.com/xxx/yyy/zzz.img"';
2$ptn='^file:"(http://[-_.!~*\'()a-zA-Z0-9;/?:@&=+$,%#]+\.img)"^';
3preg_match_all($ptn, $str, $src);
エラー以外の問題として、パターンが不完全という点が挙げられます。
目的のパターンはもしかして、file:"{url}"
という形式ではありませんか?
パターンの後ろに"
が無いようですが…
(上記した修正版ではこの点を直しています)
また、URLの正規表現そのものも不完全です。https://
に対応出来ていませんし、URLではない文字列(http:///.img
など)も許容してしまいます。
URLの厳密な正規表現は以下になります。
「RFC3986定義の厳密なHTTP URIの正規表現」をPHP用に最適化 - Qiita
ただ、見て分かる通り非常に複雑なので、これを利用しなくてはならない場合は非常に限られます。
大抵の用途であれば、filter_var関数によるURLの正当性検証で十分です。
PHPで各種バリデーション - Qiita
以下がfilter_var関数を利用した一例になります。
PHP
1$str = 'xxxxxxxxfile:"http://xxxexample.com/xxx/yyy/zzz.img"';
2$ptn='^file:"(https?://[-_.!~*\'()a-zA-Z0-9;/?:@&=+$,%#]+\.img)"^';
3preg_match_all($ptn, $str, $src, PREG_SET_ORDER);
4
57
8$src = array_filter($src, function($match){
9 return filter_var($match[1], FILTER_VALIDATE_URL);
10});
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。