1

正規表現を学んでいますが、出力から特定のものを「取り出す」方法がわかりません。

例 - 特定の CSS スタイルの値を取得したい。

簡単な例を次に示します。

$source = 'foo { bar: Something }
           foo { bar: Else }
           foo { bar: Yay }';

var_dump の後にこれを出力したい:

array(3) {
  [0]=>
  string(9) "Something"
  [1]=>
  string(4) "Else"
  [2]=>
  string(3) "Yay"
}

これが私の正規表現です:

preg_match_all("/foo\s*{\s*bar:\s*[A-Za-z]*\s*}/",$source,$matches);
    
foreach($matches as $example) {
   echo '<pre>';
   var_dump($example);
   echo '</pre>';
   }

そして、私は得ています:

array(3) {
  [0]=>
  string(22) "foo { bar: Something }"
  [1]=>
  string(17) "foo { bar: Else }"
  [2]=>
  string(16) "foo { bar: Yay }"
}

出力データを制限して、正規表現に一致するすべてではなく、目的のコンテンツのみを表示する方法は?

4

3 に答える 3

2
preg_match_all("/foo\s*{\s*bar:\s*([A-Za-z]*)\s*}/",$source,$matches);
                                  ^----     ^----

この場合の括弧は「キャプチャ グループ」と呼ばれます。

http://nz.php.net/manual/en/regexp.reference.subpatterns.php

于 2012-05-17T23:21:51.810 に答える
2

正規表現を次のように変更してみてください

/foo\s*{\s*bar:\s*([A-Za-z]*)\s*}/

そして、出力をもう一度見てください。取得したいテキストのみを含むエントリが出力に表示される可能性があります。

を使用()て正規表現内にグループを作成すると、preg_match_all 関数はそれらのグループ内のコンテンツのみを出力します。

出力配列

例:

$text = 'Here comes a number: 5, here comes a number: 3
          and here comes a number: 4';
preg_match_all( '/[Hh]ere comes a number: ([0-9])/', $text, $matches );

このコードを実行すると、次の$matchesようになります。

array(
    array( 'Here comes a number: 5', '5' ),
    array( 'Here comes a number: 5', '5' ),
    array( 'Here comes a number: 5', '5' )
)

ご覧のとおり$matches、一致するすべての文字列の配列が含まれます。最初のエントリ ( $matches[0]) には常に完全な一致文字列が含まれます。他のインデックス ($matches[1]など$matches[2]) には、指定されたグループの値のみが順番に含まれます。オプションのグループ ( などtest([0-9])?) を指定すると、関連付けられたインデックスにnull値が含まれます。

出力からのグループの除外

グループを指定したいが、それを出力配列に含めたくない場合があります。例えば:

$text = 'Here comes a number: 5, here comes another number: 3
          and here comes a number: 4';
preg_match_all( '/[Hh]ere comes a(nother)? number: ([0-9])/', $text, $matches );

notherオプションにしたいので、グループを追加しました。現在、 my$matches[1]には"nother"またはが含まれてnullおり、 my$matches[2]には実際の番号が含まれています。ユーザーが"another""a" のどちらを選択したかには関心がないので、このグループを出力から除外したいと思います。

これは、でグループを開始することで実行できます(?:。結果のコード:

$text = 'Here comes a number: 5, here comes a number: 3
           and here comes a number: 4';
preg_match_all( '/[Hh]ere comes a(?:nother)? number: ([0-9])/', $text, $matches );

グループ(?:nother)は出力では無視され、$matches[1]関心のある実際の数への参照が表示されます。

于 2012-05-17T23:22:12.627 に答える
1

一致させたい地域を括弧で囲みます。

于 2012-05-17T23:21:59.650 に答える