2012-03-11 3 views
2

を使用してテキストを選び出す私はは正規表現

$text='remove1 \solution{keep1} remove2 \solution{keep2 inner{text}} remove3'; 

を持っており、

\solution{keep1}\solution{keep2 inner{text}} 

を終了するにpreg_replaceを使用したい私はほとんど

$re = '/[^{}]*+(\{(?:[^{}]++|(?1))*\})[^{}]*+/'; 
$text = preg_replace($re, '$1', $text); 

を使用してソリューションを持っている。しかし、これはありません\ソリューションを手前に置いてください。これをどうすれば解決できますか?

EDIT:\ solutionは、検索する固定文字列であることを意味し、他のすべてのテキスト部分は任意であることを意味します。

+0

いただきました!あなたの予想される出力の考えを示しましたか? –

+0

\ solution {keep1} \ solution {keep2 inner {text}}、上記の2番目のコード行。 – Geoff

+0

あなたはいつも '\ solution {'で始まると思っていますか?この '\ solution {keep2 inner {text} keep3}'のように、ネストされた中括弧のペアの後にテキストがあってもかまいませんか? – Borodin

答えて

1
  • 私はなどremove1を推定彼らは空白文字列コンポーネントの残りの部分からそれらを分離している基づいて削除すべきか?私はそれらを排除するための他のルールを見ることができません。だからあなたのキャラクタークラスは[^{}\s]でなければなりません。

  • また、正規表現エンジンを壊すことはありませんが、[^{}]*+[^{}]++は大きな違いはありません。ちょうど[^{}]*または[^{}]+を使用してください。

一緒に使用すると、テキストの一部にしたいすべての配列とjoinそれらすべてを見つけることがはるかに簡単です。このコードは、

$text = 'remove1 \solution{keep1} remove2 \solution{keep2 inner{text}} remove3'; 
$re = '/ \\\\solution ( \{ [^{}]* (?: (?1) [^{}]*)* \} ) [^{}\s]* /x'; 

preg_match_all($re, $text, $matches); 

$text = join($matches[0]); 

echo $text; 

OUTPUT

\solution{keep1}\solution{keep2 inner{text}} 
+0

これは動作しますが、regexpのどこに\ソリューションがありますか?これをどう見ているのですか?または私は何かを逃していますか?たとえば、私は一緒に\質問を収集するために、このテクニックを使用したいと思います、私は何をするでしょうか? – Geoff

+0

私は\ solution {text}がほしいと思っているのに対し、あなたのコードはすべて\ something {text}を選んだので動かないことに気付きました。 – Geoff

+0

質問からあなたが望むものを正確に伝えるのは非常に難しいです。 'remove'は任意のテキストであることができますが、' solution'は文字通り意味されることが判明しました。あなた自身の正規表現に '\ solution'の言及はありませんでした。そのため、スペースカッコが開きブレースの前にあると仮定しました。私はあなたが今思っていることをするために私の答えを修正しました。 – Borodin

0

必要なテキストをキャプチャしてから爆縮します。

preg_match_all('#\solution\{[^\}]*\}#msi', $text, $matches); 
$text = implode($matches[0],''); 
+0

私の編集内容を参照してください... –

+0

再度、出力はありません。しかし、おそらく私はあなたの考えを間違ってテストしている。私は3行のテストファイルを持っています: '$ text = ...;'そして最後の行をエコーし​​ながら2行を続けます。 – Geoff

+0

私はpreg_match_all( '#solution \ {[^ \}] * \}#msi'、$ text、$ matches);を実行すると、\ solutionのバックスラッシュをエスケープする必要があると思います。出力として取得する: 'solution {keep1} solution {keep2 inner {text}'。最後の}が欠落していることに注意してください。 – Geoff