2

私はテキストを持っています:

$test = <<<START
 DOTHIS themsp1
  @theint =    431,
  @theText = "%dumdum%",
  @operator = 'ANY',
  @crossCheck = 'PLUS'


START;

フィルター:

$regEx = '/@(.*)=(.*)[,]*?/';
preg_match_all($regEx,$test,$vars,PREG_SET_ORDER);
print_r($vars);

出力:

Array
(
    [0] => Array
        (
            [0] => @theint =  431,
            [1] => theint 
            [2] =>   431,
        )

    [1] => Array
        (
            [0] => @theText = "%dumdum%",
            [1] => theText 
            [2] =>  "%dumdum%",
        )

    [2] => Array
        (
            [0] => @operator = 'ANY',
            [1] => operator 
            [2] =>  'ANY',
        )

    [3] => Array
        (
            [0] => @crossCheck = 'PLUS'
            [1] => crossCheck 
            [2] =>  'PLUS'
        )

)

出力にコンマや空白は必要ありません:(..問題は、コンマがオプションであるということです。

4

3 に答える 3

2

正規表現$regEx = '/@(.*)=(.*)[,]*?/';では、2番目(。*)は貪欲で、コンマと一致します。これは、作成したコンマはオプションであるためです。

テストされていない場合、この正規表現は等号の前後にオプションのスペースを許可しますが、キャプチャ'/@([^\s=]+)\s*=\s*([^\s,]+)\s*,?/' には含めません。値とコンマの間にスペースも許可します。

于 2010-08-16T20:38:34.340 に答える
2
/@(.*?)\s*=\s*(.*?),?/

\s*空白に一致する適切な場所に追加します。に疑問符を使用して、.*?貪欲に一致しないようにします。欲張りでない一致は可能な限り短い一致に一致するため、右側のコンマは、コンマをキャプチャするの(.*?),?ではなく、コンマと一致させます。.*

于 2010-08-16T20:35:11.353 に答える
0

.たとえば、単に使用するよりも具体的にする必要があります。

/@([a-zA-Z]+)[ \t]*=[ \t]*([0-9]+|"(?:[^\\"]|\\.)*"|'(?:[^\\']|\\.)*')[ \t]*,?/

ここで[a-zA-Z]+は、名前をアルファベット文字のシーケンスとして指定しました。その後=、スペースまたはタブで囲まれている可能性のあるが続きます。そして、値は、数値([0-9]+、1つ以上の数字のシーケンス)またはエスケープシーケンス("(?:[^\\"]|\\.)*"|'(?:[^\\']|\\.)*')を含む可能性のある引用符で囲まれた文字列のいずれかであり、その後にオプションのスペースまたはタブが続きます。

于 2010-08-16T20:38:17.207 に答える