2011-02-01 2 views
1

フランス語(カナダ)と英語が混在したテキストからドル金額を解析しようとしています。テキストはUTF-8です。彼らは通貨を示すために$ Cを使用します。何らかの理由で私がpreg_matchを使うとき、 '$'も 'C'も見つけられません。それ以外はうまく動作します。何か案は?

preg_match_all('/\$C/u', $match) 「46,00 $ Cのお支払いありがとう」は空です。

+0

$は実際の文字列「お支払いありがとう...」と一致していますか?そうでなければ、あなたは議論を忘れてしまった。 ;) – netcoder

+0

46,00または$ Cを抽出しようとしていますか? –

答えて

2

正規表現ではこれらの文字が見つからないと思います。あなたはこのような文字列を初期化する場合:

$source = "Thanks for a payment of 46,00 $C"; 

...(。すなわち、リテラルの二重引用符で囲まれた文字列として)、$Cは、変数名として解釈されます。 は、という変数を初期化していないので、実際の文字列では何も置き換えられません。文字列を初期化するには一重引用符を使用するか、正規表現の場合と同様にバックスラッシュでドル記号をエスケープする必要があります。

ところで、これはエンコードの問題ではない可能性があります(この例では少なくとも)、すべての文字はASCII文字セットからのものです。それがUTF-8、ISO-8859-1またはASCIIとしてエンコードされているかどうかにかかわらず、文字列のバイナリ表現は同じです。

0
preg_match_all('/\$C/u', 'Thanks for a payment of 46,00 $C', $matches); 
print_r($matches); 

私のために正常に動作します:

Array 
(
    [0] => Array 
     (
      [0] => $C 
     ) 

) 
+0

これは本当に答えではありません... – netcoder

+0

UTF-8が問題になることがありますか? – whamsicore

+0

@netcoder:そうです。それは彼の質問がいくつかの重要な細部を逃していることをワムシコアに伝えている。 – ThiefMaster

0

は多分これは役立ちます:

// assuming $text is the input string 
$matches = array(); 
preg_match_all('/([0-9,\\.]+)\\s*\\$C/u', $text, $matches); 
if ($matches) { 
    $price = floatval(str_replace(',', '.', $matches[1][0])); 
    printf("%.2f\n", $price); 
} else { 
    printf("No price found\n"); 
} 

ただ、入力文字列($text)が適切にUnicode文字列にデコードされたことを確認してください。たとえば、UTF-8の場合は、utf8_decode関数を使用してください。