2011-01-13 16 views
1

私は正規表現について勉強をヘルプ、私は1つまたは複数の文字にマッチについていくつかを考え出したが、私はケースを持っていますが、これを解決する方法がわからない...例えばはPHPで正規表現

私が持っています:

$data = "bla bla -start- blu blu blu -end- bla bla"; 
$pattern = "/\-start\-[\w]\-end\- /"; 
preg_match($pattern, $data, $matches); 
print_r($matches); 

i 'は-start-' と ' - 終わり - ' の間の何かを取るつもりなので、私は
'ブルブルブルーレイ' を得ることを期待。
提案がありますか?

答えて

4

\wは単語文字のみを表し、スペースも許可する必要があります。 -start--end-の間に何かを許可したい場合は、任意の文字に一致する.を使用できます。 (角括弧[]間の)文字パターンで囲まれていない限り

ハイフンはエスケープする必要がないので、あなただけの-\-を置き換えることができます。ただ、単一\wを使用してのような

はどの単一単語文字、.はどの単一文字にマッチ表しので、あなたは、いくつかのより多くの情報を追加する必要があるのマッチングを表す。+でこれらのいずれかに続いて、少なくともをマッチング示すだろう文字、または*を指定すると、が0以上の文字が表示されます。文字。

$pattern = "/-start-(.+)-end- /"; 

はあなたのような表現が発生することがありますと仮定すると:あなたは、少なくとも一つの文字をしたいと仮定すると、あなたの表現は、このような大丈夫でなければなりません-start- foo -end- -end-、あなたが最初-end-に終了したい(抽出するコンテンツがfooです)、あなたは非貪欲な方法で操作する必要があります。 PHPの正規表現は、これをオフにするには、デフォルトで貪欲で、あなたはこのように、?+(または*)に従う:

$pattern = "/-start-(.+?)-end- /"; 
+0

ハイフンは、文字クラスを除いてエスケープする必要はありません。あなたの答えは、そうでなければスポットライトです。 – coreyward

+0

@coreyward:私はそう思っていないし、チェックしていた - 迅速なテストを実行し、特にエスケープは何も壊れていない。とにかく、適切に更新されました。 –

+0

彼の質問には言及していませんが、 '-start-'と '-end-'の間に改行文字がある場合は、 's'の" dot-all "修飾子を設定したいと思うでしょう。したがって、 '$ pattern ="%-start-(。+?)-end-%six ";'エンジンが空白を無視するので、複雑なパターンを読みやすくするために 'x'修飾子を使います大文字と小文字を区別しないための 'i'修飾子だけでなく、' \ s'で含める場合は空白をパターンに追加する必要があります)。 – Dan