特定の検索文字列の「コンテキスト」を取得したい。たとえばmyself
、次の行の検索文字列の場合
私と犬と私は休暇に出かけます。
dog and myself are going
N=2を取得したい。つまり、試合前に 2 単語、試合後に 2 単語。
現在、次のように行全体を一致させます。
$lines = file($file->getFilename());
$lines = preg_grep('/'.$_POST['query'].'/', $lines);
特定の検索文字列の「コンテキスト」を取得したい。たとえばmyself
、次の行の検索文字列の場合
私と犬と私は休暇に出かけます。
dog and myself are going
N=2を取得したい。つまり、試合前に 2 単語、試合後に 2 単語。
現在、次のように行全体を一致させます。
$lines = file($file->getFilename());
$lines = preg_grep('/'.$_POST['query'].'/', $lines);
preg_grep()はそのように動作するはずですが、preg_match()が必要なように思えます。また、テキスト内に検索された単語の複数のインスタンスがあり、それらすべてを検索したい場合に備えてpreg_match_all()
あなたが探している正規表現は次のとおりです:(?:[^ ]+ ){0,2}myself(?: [^ ]+){0,2}
ここで説明されたデモ: http://regex101.com/r/pB3eW0
それ以外の場合は 1 語またはまったく 一致しない場合は、前後の 2 語に一致するように設計しました。
変数Nを許可するコードは次のようになります。
$fileData=file_get_contents($file->getFilename());
$n=2;
$query='myself';
preg_match_all('/(?:[^ ]+ ){0,'.$n.'}'.$query.'(?: [^ ]+){0,'.$n.'}/i',$fileData,$matches);
print_r($matches);
ユーザー入力を検証してエスケープすることを忘れないでください。与えられた関数で使用するだけではありません。