2016-08-14 2 views
1

preg_match_allを使用して文字列内の指定されたキーワードを検索していますが、見つかった場合はそのキーワードの前後にいくつかの単語を選びます。私はここでのキーワードは、キーワード、$ prevをし、$は次の多くの単語を選択する必要がどのように表現する番号は、$テキストがメインの文字列と$出力は、得られる配列されている$ preg_match_allPHP preg_match_allが目的の出力を返さない

preg_match_all('~\b(?:[^ ]+){0,'.$prev.'}'.trim($keyword).'(?: [^ ]+){0,'.$next.'}\b~i',$text,$output); 

の下に使用しています。私の文字列はここで

PROFIT & LOSS NOFORMING P 152 22. ADDITIONAL INFORMATION: A) AUDITORS REMUNERATION (EXCLUDING SERVICE TAX) (` in crores) ParticularsCurrent yearPrevious year As audit fees (including limited review) 3.45 2.42 

キーワードを下回っているのであれば、私はこの

EXCLUDING SERVICE TAX) (` in crores) ParticularsCurrent yearPrevious year As audit fees (including limited review) 3.45 2.42 

しかし、私のキーワードと次の単語がありません持っている場合は、以下の文字列、のように、所望の出力を取得するには、「監査費用」でありますその間の空白は、その文字列の前に少数の単語を返しますが、そのキーワードの次の単語は返しません。

PROFIT & LOSS NOFORMING P 152 22. ADDITIONAL INFORMATION: A) AUDITORS REMUNERATION (EXCLUDING SERVICE TAX) (` in crores) ParticularsCurrent yearPrevious year As audit fees(including limited review) 3.45 2.42 

は、それはちょうど親切にも私のキーワードの場合、次の単語を取得する方法を、ここに私を導い

EXCLUDING SERVICE TAX) (` in crores) ParticularsCurrent yearPrevious year As audit fees 

を返し、それが次の単語がそれらの間にスペースがないのです。オプションでなければなりません

+0

https://www.regex101.com/r/wY6sP3/1 – splash58

+0

ねえ@ splash58、偉大な仕事の人は、それが魅力のように働きました、 ありがとうございました。あなたの答えを掲示してください、私はそれを正しいものとして選択します。 –

+0

@ChangezKhan:キーワードの前後に単語間にスペースがない場合はどうなりますか? –

答えて

1

あなただけのキーワードの後に​​言葉を心配している場合は、必ずスペース文字(または非単語の文字)を一致させる必要がある(ゼロ以上):

'~\b(?:\S+\s+){0,10}Audit Fees(?:\s*\S+){0,5}\b~' 

参照してください。 this regex demo

これにより、キーワードの後に​​空白以外のチャンク間の空白を置き換えます(\s*はゼロ以上の空白に一致します)。

パターンは詳細:

  • \b - 先頭ワード境界
  • (?:\S+\s+){0,10} - ゼロから10 1+非空白記号は1+空白
  • Audit Fees
  • に続く - リテラルキーワード
  • (?:\s*\S+){0,5} 0〜5個の0 +空白記号の後に1+空白記号なし
  • \b - ワード境界

PHP demoを末尾:

$prev = 10; 
$keyword = "Audit Fee"; 
$next = 5; 
$text= "PROFIT & LOSS NOFORMING P 152 22. ADDITIONAL INFORMATION: A) AUDITORS REMUNERATION (EXCLUDING SERVICE TAX) (` in crores) ParticularsCurrent yearPrevious year As audit fees(including limited review) 3.45 2.42"; 
$re = '~\b(?:\S+\s+){0,'.$prev.'}'.trim($keyword).'(?:\s*\S+){0,'.$next.'}\b~i'; 
preg_match_all($re,$text,$output); 
print_r($output); 
+1

それもうまくいった。ありがとう。 –

関連する問題