3

テキストで「セッション」という単語を検索したい。しかし、この単語が含まれる行全体を取得したいと思います。これまでのところ、私はこれを思いつきました。

$pattern="[^\\n]*session[^\\n]*";
preg_match_all($pattern,$content, $matches, PREG_OFFSET_CAPTURE);

しかし、「不明な修飾子 '*'」というエラーが表示されます。このような正規表現を作成する方法はありますか?

4

1 に答える 1

8

正規表現に区切り文字がないため、エラー:

$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"
}

あなたのパターンは、「強迫観念という言葉をスキップする」という行を見つけたでしょう。

于 2013-02-03T18:01:12.840 に答える