0

PHP の正規表現マッチングに問題があります。

私が解決しようとしている問題は、文字列から 10 進数値を取得する必要があることです。式は、次のすべてを満たす必要があります (すべてのドル記号はオプションです)。

($)1234.56
($)1,234.56
($)1.00
($)10
($).49
($)1,234,567.32
($)1,234,567

オンラインでいくつかの素晴らしい例を見つけた後、この表現を一緒にフランケンシュタイン化することができました。

/(?:^|\s|\$)([1-9](?:\d*|(?:\d{0,2})(?:,\d{3})*)(?:\.\d*[0-9])?|0?\.\d*[0-9]|0)(?:\s|$)/

この preg_match テスターを solmetraで使用する場合、上記のパターンとテスト文字列 'per unit price $19198.01 hey!' を使用します。次の結果が得られます。

Array
(
    [0] => $19198.01 
    [1] => 19198.01
)

これは素晴らしいです - それはまさに私が必要としているものです!

ただし、PHP 5.3.10 で以下のコードを実行すると、このパターン文字列を使用した一致の出力として null が返されます。

コード:

  $pattern = '/(?:^|\s|\$)([1-9](?:\d*|(?:\d{0,2})(?:,\d{3})*)(?:\.\d*[0-9])?|0?\.\d*[0-9]|0)(?:\s|$)/';
  $subject = 'per unit price $19198.01 hey!';
  $matches = preg_match($pattern,$subject);                
  var_dump($matches[0]); //dumps "null"

私は何か間違ったことをしていると確信していますが、それを見ることができません。

どんな助けでも大歓迎です。

環境:

PHP  5.3.10
Apache 2.2.21
Windows 2008 Server
4

1 に答える 1

5

あなたのエラーは関数の使用法にあります:

 $matches = preg_match($pattern,$subject);   

あなたが実際に得ているものは次のとおりです。

 $booleanresult = ...

preg_matchただし、実際の結果を得るには、3 番目のパラメーターが必要です。

 $bool = preg_match($pattern, $subject, $matches);   

そしてほら、あなたの正規表現は実際に機能します。/xもう少し読みやすくするために、フラグを追加することをお勧めします。

于 2012-05-25T13:42:43.133 に答える