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