テキストで「セッション」という単語を検索したい。しかし、この単語が含まれる行全体を取得したいと思います。これまでのところ、私はこれを思いつきました。
$pattern="[^\\n]*session[^\\n]*";
preg_match_all($pattern,$content, $matches, PREG_OFFSET_CAPTURE);
しかし、「不明な修飾子 '*'」というエラーが表示されます。このような正規表現を作成する方法はありますか?
テキストで「セッション」という単語を検索したい。しかし、この単語が含まれる行全体を取得したいと思います。これまでのところ、私はこれを思いつきました。
$pattern="[^\\n]*session[^\\n]*";
preg_match_all($pattern,$content, $matches, PREG_OFFSET_CAPTURE);
しかし、「不明な修飾子 '*'」というエラーが表示されます。このような正規表現を作成する方法はありますか?
正規表現に区切り文字がないため、エラー:
$pattern = "/[^\\n]*session[^\\n]*/";
// or, with single quotes, you don't need to escape \n
$pattern = '/[^\n]*session[^\n]*/';
私があなたの意図を正しく解釈すれば、0 個以上の改行ではなく、その後に「セッション」が続き、その後に 0 個以上の改行ではないものと一致させようとしています。
より単純な (潜在的により正確な) パターンは次のようになります。
$pattern = '/^.*\bsession\b.*$/m';
つまり、行頭 ( ^
) から 0 個以上の任意の文字 ( .*
)、単語境界 ( \b
)、単語「セッション」、別の単語境界、別の一連の文字、および行末 ( $
)、複数行にわたるマッチング (m
修飾子)。
アンカー ( ^
and $
) を少し再発明しましたが、[^\n]
これはやや自明ではありませんが、単語の境界を見逃しています。これは、単語 "session"を含む単語と一致しているため、おそらく望ましくありません。つまり、あなたのものは「sessions」または「possessions」または「obsessions」または「abcsessionxyz」を含む行に一致しますが、私のものは一致しません。これが望ましくない場合は、\b
の yieldingを削除する/^.*session.*$/m
と、パターンは多かれ少なかれ同等になります。
これは、単語を含む中央の行全体を見つける概念実証です。
<?php
$lines ="This is a test
of skipping the word obsessions but
finding the word session in a
bunch of lines of text";
$pattern = "/^.*\bsession\b.*$/m";
$matches = array();
preg_match($pattern, $lines, $matches);
var_dump($matches);
出力:
array(1) {
[0]=>
string(29) "finding the word session in a"
}
あなたのパターンは、「強迫観念という言葉をスキップする」という行を見つけたでしょう。