5

変数からテキストの一部を抽出するために使用preg_match()しています。変数が次のようになっているとします。

[htmlcode]This is supposed to be displayed[/htmlcode]

middle text

[htmlcode]This is also supposed to be displayed[/htmlcode]

の中身を抽出[htmlcode]して配列に入力したい。を使用してこれを行っていpreg_match()ます。

preg_match('/\[htmlcode\]([^\"]*)\[\/htmlcode\]/ms', $text, $matches);
foreach($matches as $value){
return $value . "<br />";
}

上記のコード出力

[htmlcode]This is supposed to be displayed[/htmlcode]middle text[htmlcode]This is also supposed to be displayed[/htmlcode]

それ以外の

  1. [htmlcode]これは表示されるはずです[/htmlcode]
  2. [htmlcode]これも表示されるはずです[/htmlcode]

正式にアイデアが尽きた場合

4

4 に答える 4

4

すでに説明したように; *パターンは貪欲です。もう1つは、preg_match_all()関数を使用することです。一致したコンテンツの多次元配列が返されます。

preg_match_all('#\[htmlcode\]([^\"]*?)\[/htmlcode\]#ms', $text, $matches);
foreach( $matches[1] as $value ) {

そして、これを取得します:http://codepad.viper-7.com/z2GuSd

于 2013-05-09T23:27:40.137 に答える
3

ハタは貪欲です。つまり、最後*まですべてを食べてしまいます。non-greedyに置き換えてみてください。 [/htmlcode]**?

于 2013-05-09T23:22:03.907 に答える
2

*デフォルトでは貪欲です([^\"]*?)(追加された に注意して?ください)それを怠惰にする必要があります。

于 2013-05-09T23:22:01.643 に答える
2

このコードを見てください:

preg_match('/\[htmlcode\]([^\"]*)\[\/htmlcode\]/ms', $text, $matches);
foreach($matches as $value){
return $value . "<br />";
}

ここで、パターンが正常に機能し、すべてが問題ない場合は、次のことを知っておく必要があります。

  • returnステートメントはすべてのループを中断し、関数を終了します。
  • 一致の最初の要素は、一致全体、つまり文字列全体です。あなたの場合$text

つまり、最初の大きな文字列を返し、関数を終了しました。

望ましい結果を確認できることをお勧めします。

$matches[1]$matches[2]

于 2013-05-09T23:22:23.067 に答える