preg_grep()
は、コードの短いラインを提供していますが、一致する部分文字列がそれに任意の変数の文字を持っているように見えていないため、ベストプラクティスはstrpos()
がより適していることを示すでしょう。
コード:(Demo)
$urls=[
'http://www.example.com/eng-gb/products/test-1',
'http://www.example.com/eng-gb/badproducts/test-2',
'http://www.example.com/eng-gb/products/test-3',
'http://www.example.com/eng-gb/badproducts/products/test-4',
'http://www.example.com/products/test-5',
'http://www.example.com/eng-gb/about-us',
];
var_export(preg_grep('~^http://www.example\.com/eng-gb/products/[^/]*$~',$urls));
echo "\n\n";
var_export(array_filter($urls,function($v){return strpos($v,'http://www.example.com/eng-gb/products/')===0;}));
が出力:
array (
0 => 'http://www.example.com/eng-gb/products/test-1',
2 => 'http://www.example.com/eng-gb/products/test-3',
)
array (
0 => 'http://www.example.com/eng-gb/products/test-1',
2 => 'http://www.example.com/eng-gb/products/test-3',
)
いくつかの注意:
preg_grep()
を使用する:
- ように、非スラッシュパターンの区切り文字を使用しますあなたがやるパターン内のすべてのスラッシュをエスケープする必要はありません。
.com
の点をエスケープします。
- 最も厳密な検証のために、開始アンカーと終了アンカーで完全なドメインとディレクトリパスを記述します。
- パターンの最後の近くにネゲートされた文字クラスを使用して、追加のディレクトリが追加されないようにします(もちろん、すべてのサブディレクトリを含める場合を除きます)。
- 私のパターンは、
/products/
で終わるURLと一致しますが、/products
では一致しません。これはあなたの質問の詳細に従います。strpos()
使用
:
strpos()===0
の確認は、サブ文字列の開始時に見つけなければならないことを意味しています。
- これは、文字列の末尾に後続の文字を許可します。