2017-06-08 14 views
2

の前と後に、私はこのようになり、データの文字列があります。PHPの正規表現マッハ特定の単語

$string = ' 
    foo=bar 
    badge_name_foo=foo 
    bar_badge_name=bar 
    bar=baz 
'; 

を私はすべての*_badge_namebadge_name_*文字列にマッチします。使用

正規表現イムはこれです: preg_match_all('~(?:(\w+)_)?badge_name(?:_(\w+))?~', $string, $matches, PREG_SET_ORDER);

結果は次のとおりです。

Array 
(
    [0] => Array 
     (
      [0] => badge_name_foo 
      [1] => 
      [2] => foo 
     ) 

    [1] => Array 
     (
      [0] => bar_badge_name 
      [1] => bar 
     ) 

) 

*_badge_nameが正常に動作しているが、badge_name_*に毎回空の値がありますか?今、どのように私はpreg_match_all

期待される結果となる必要があることを削除することができます:それはあなたがBRANCH RESET featureを使用する必要があるようだ

Array 
(
    [0] => Array 
     (
      [0] => badge_name_foo 
      [1] => foo 
     ) 

    [1] => Array 
     (
      [0] => bar_badge_name 
      [1] => bar 
     ) 

) 

答えて

1

Alternatives分岐リセットグループ共有の内側に同じキャプチャグループを。構文は(?|regex)です。(?|はグループを開き、regexは正規表現です。ブランチリセットグループ内で交互またはキャプチャグループを使用しない場合、その特殊機能は機能しません。それはnon-capturing groupとして機能します。

使用

(?|(\w+)_badge_name|badge_name_(\w+)) 
^^^ 

regex demoを参照してください。

PHP demo

$re = '/(?|(\w+)_badge_name|badge_name_(\w+))/'; 
$str = 'foo=bar 
badge_name_foo=foo 
bar_badge_name=bar 
bar=baz'; 
preg_match_all($re, $str, $matches); 
print_r($matches); 

結果:

Array 
(
    [0] => Array 
     (
      [0] => badge_name_foo 
      [1] => bar_badge_name 
     ) 

    [1] => Array 
     (
      [0] => foo 
      [1] => bar 
     ) 

) 
+1

が魔法のように動作し、ありがとうございます! – Tafelglotzer

関連する問題