2012-04-19 14 views
4

私はPHP preg_match_allとREGEX質問を持っています。引用符内にエスケープされた引用符でREGEXを使用する

私は、次のコードをしている:

<?php 

$string= 'attribute1="some_value" attribute2="<h1 class=\"title\">Blahhhh</h1>"'; 

preg_match_all('/(.*?)\s*=\s*(\'|"|&#?\w+;)(.*?)\2/s', trim($string), $matches); 

print_r($matches); 

?> 

ピックアップしていないようだ、私は引用符でHTMLに渡したいというインスタンスの引用符をエスケープ。私は引用符で囲まれたREGEXの修正の中で基本的な引用符を使ってこれに対して数多くの解決策を試しましたが、誰も私のために働いていないようです。私はこれらの既存のREGEX内に正しく配置することはできません。

私はREGEXマスターではありません、誰かが正しい方向に私を指すことができますか?

Array 
(
    [0] => Array 
     (
      [0] => attribute1="some_value" 
      [1] => attribute2="<h1 class=\"title\">Blahhhh</h1>" 
     ) 

    [1] => Array 
     (
      [0] => attribute1 
      [1] => attribute2 
     ) 

    [2] => Array 
     (
      [0] => " 
      [1] => " 
     ) 

    [3] => Array 
     (
      [0] => some_value 
      [1] => <h1 class=\"title\">Blahhhh</h1> 
     ) 
) 

ありがとう:

私が達成しようとしている結果がこれです。

+1

このコードでは、正確に何をしようとしていますか? – anubhava

+0

あなたは何をしたいですか? –

答えて

1

あなたはnegative lookbehind assertionでこれを解決することができます。

'/(.*?)\s*=\s*(\'|"|&#?\w+;)(.*?)(?<!\\\\)\2~/' 
           ^^^^^^^^^ 

終了引用符が\によって先頭に付加すべきではありません。私を与える:

Array 
(
    [0] => Array 
     (
      [0] => attribute1="some_value" 
      [1] => attribute2="<h1 class=\"title\">Blahhhh</h1>" 
     ) 

    [1] => Array 
     (
      [0] => attribute1 
      [1] => attribute2 
     ) 

    [2] => Array 
     (
      [0] => " 
      [1] => " 
     ) 

    [3] => Array 
     (
      [0] => some_value 
      [1] => <h1 class=\"title\">Blahhhh</h1> 
     ) 
) 

この正規表現は、理由はそれエンティティあなたの完璧ではないですが、そこでの区切り文字として、引用符のようにそれは\と同様にエスケープすることができます。それが本当に意図されているかどうかは分かりません。

この偉大な質問/回答もご覧ください:Split string by delimiter, but not if it is escaped

+0

これはうまく動作し、\ n文字でも機能します。偉大な答えHakreをありがとう! – cmfolio

関連する問題