php
  • regex
  • 2012-03-12 10 views 5 likes 
    5

    下のhtml文字列の角括弧内のテキストを取り込みたいと思います。 しかし、私は以下の正規表現はimageとimagealを別々に取得せず、代わりにimageを返す "alt =" [imagealt]私が文字列からalt = "[imagealt]"を取り出すと、それは私が期待する/望むように返します。大括弧内の文字列を検索する正規表現[]

    $html = '<h2>[title]</h2> 
    <div class="content"><img src="[image]" alt="[imagealt]" /></div> 
    <div class="content">[text]</div>'; 
    
    preg_match_all("^\[(.*)\]^",$html,$fields, PREG_PATTERN_ORDER); 
    
    echo "<pre>"; 
    print_r($fields); 
    echo "</pre>"; 
    
    
    Array 
    (
        [0] => Array 
         (
          [0] => [title] 
          [1] => [image]" alt="[imagealt] 
          [2] => [text] 
         ) 
    
        [1] => Array 
         (
          [0] => title 
          [1] => image]" alt="[imagealt 
          [2] => text 
         ) 
    
    ) 
    

    答えて

    7

    は、あなたの正規表現が貪欲され発見された後に停止します。あなたが望むことをするのは欲張りにならないようにする必要があります。貪欲についてもっと知るにはhere

    マッチが欲しいときは、正規表現を満たす最初の状況を無視し、できるだけ多くの入力を消費するまで一致を試みます。

    は、通常、これは?を加えることを含むが、私は、PHPのかどうか分からないが、あなたは試みることができる:文字列の先頭をマークするために

    preg_match_all("^\[(.*?)\]^",$html,$fields, PREG_PATTERN_ORDER); 
    
    3

    使用

     preg_match_all("^\[(.*?)\]^",$html,$fields, PREG_PATTERN_ORDER); 
    

    余分?を意味し、 "非欲張りマッチ" それは]

    5
    preg_match_all("#\[[^\]]*\]#",$html,$fields, PREG_PATTERN_ORDER); 
    

    ^キャレットが使用されているので、私は使用します混乱を避けるための区切り文字は#または|です。また、]の終わりに達すると停止することが確実になるため、.*?の代わりに[^\]*]を使用しますが、.には遅延修飾子が必要ですが、m修飾子にも属性が含まれていると改行がキャプチャされるようにしますそれら。

    関連する問題