2012-02-04 16 views
2

前後に何があるかを覚えている間に、特定のパターンを複数回キャプチャする必要があります。たとえば、次のように複数の正規表現のキャプチャ

いくつかのテキストは、いくつかのより多くのテキストがいくつかのより多くの テキスト

が予測されている唯一のものは、テキストをキャプチャするために区切るトークンで「撮影する」、「捕獲します」 。キャプチャされたテキスト自体は毎回異なります。最後に、私は、CSSは、これらの捕獲部分を中心にまたがる配置する必要があり、そう

some text <span class="a">"to be captured"</span> some more text <span 
class="a">"to be captured"</span> some more text 

ように私はそれが唯一のキャプチャとのラインのために働く

if (preg_match("/(.*?)(\".*?\")(.*)/", $line, $m) 
    $res .= $m[1] . '<span class="a">' . $m[2] . '</span>' . $m[3]; 

を試してみました。 preg_match_allを使ってもこれを修正することはできませんが、おそらく正規表現自体も変更する必要がありますが、どうすればよいのか分かりません。

答えて

3

preg_replaceを試しましたか?

$line = preg_replace("/(\".*?\")/", 
        '<span class="a">$1</span>', 
        $line 
); 

ps:私はOPの問題は何であるかまだ分かりませんが、例はありません。

$matchs_and_in_between = preg_split('/"(.*?)"/', $src, 
          PREG_SPLIT_DELIM_CAPTURE); 

:あなたは区切り文字のセットを持っている場合は、正規表現を使用すると、基本的にすべてのものをキャプチャしますが、あなたの特定の部分が分離したい場合は、その後、あなたはpreg_splitを使用することができるかもしれません

$str = 'some text "to be captured" some more text #to be *captured# 
      some more text* but I would capture that*'; 
echo preg_replace('/(("|#|\*).*?\\2)/s', 
        '<span class="a">$1</span>', 
        $str); 
+0

これは意図していない ""いくつかのテキストに一致します。 – Grilse

+0

@グリル質問には従いません。 '予測可能なのは、取り込むテキストを区切るトークンだけです。 – Cheery

+0

それを言い換えると、 区切り文字が3つ以上ある場合、区切り文字2と区切り文字3の間の任意のテキストと一致します。これは意図しないものです。 – Grilse

0

可能性がありトリックはフラグです。結果配列をループする必要があります。すべての2番目のエントリは正規表現で指定したものです。残りは中間部分です。

1

私はPHPを知らないが、正規表現でのみ見ているあなたは、このために検索する必要があります。([^"]*)(".*?")この$1<span class="a">$2</span>

some text "to be captured" some more text "to be captured" some more text 
some text "to be captured" some more text "to be captured" 

と交換しては、この与える:

some text <span class="a">"to be captured"</span> some more text <span class="a">"to be captured"</span> some more text 
some text <span class="a">"to be captured"</span> some more text <span class="a">"to be captured"</span> 

を:: EDIT :: このPHPコードが動作しているようだ:

$line = 'some text "to be captured" some more text "to be captured" some more text'; 

$line2 = preg_replace('/([^"]*)(".*?")/', htmlspecialchars('$1<span class="a">$2</span>'),$line); 

echo $line2; 
1

あなたのコードがうまくいかない主な理由は、第3のグループ(.*)が、残りのすべての引用符を含めて、最初の引用セクションの後にすべてを盛り上げるからです。 .が改行と一致した場合、残りの行だけでなく、残りのすべての引用が食べられます。

@ Cheeryのソリューションは、第3グループを非貪欲にすることによってその問題に対処しています。(.*?)。それはうまくいくが、第3のグループは決して何も捕らえないからだ。それができるすべてを消費するのではなく、何も消費しないことから始まります。それは受け入れられるもので、正規表現でそれを消費させることはそれ以後何もないので、そこでは止まります。

この問題を解決する正しい方法は、のみをと強調表示したい部分に一致させることです。それを囲むタグでそれを戻すためにキャプチャグループを使用し、テキストのみの残りの部分を残して:実際には

$line = preg_replace('/("[^"]*")/', '<span class="a">$1</span>', $line); 

、あなたもキャプチャグループを使用する必要はありません。試合は今だけ引用されたセクションから構成されているので、あなたはそれを再挿入する$0を使用することができます。

$line = preg_replace('/"[^"]*"/', '<span class="a">$0</span>', $line); 

EDIT: @Cheeryは、それが適用されなくなりますについての彼の答えと私のコメントを編集しました。私はこの答えはまだいくつかの価値を追加すると思うので、私は先に行くとそれを残します。