0

分割している文字列には、次のような種類のコンテンツが含まれています。

$string = "$100 USD per year"
$string = "$100USD per year"
$string = "100 USD per year"
$string = "100EUR per year"
$string = "€100EUR per year"
$string = "€100 EUR per year"

これは私が使用している正規表現です(そしてExpressoで機能します):

$pattern = "/\$?(\d+\.\d+)(\w{0,3})\s(.*)/i";

基本的に、最終結果は次のような配列になります。

$arr[0] = "$100" // the "$" optional, also number might be integer or decimal
$arr[1] = "USD";
$arr[2] = "per year";

これは私が実行しているサンプルPHPコードですが、役に立ちません。

<?php
$content = "$99.37CAD per year";

$pattern = "/\$?(\d+\.\d+)(\w{0,3})\s(.*)/i";

$myArr = preg_split($pattern, $content);

echo "<pre>";
var_dump($myArr);
echo "</pre>";
?>

そして、出力は次のとおりです。

bool(false)

誰かが私を正しい方向に向けてくれませんか?

4

2 に答える 2

2

あなたはmatchそれをする必要はありませんsplit..

また、正規表現は

  |->required to capture $ or €
  |                |-----------|-------->needed since there can be 0 to many spaces
 --               ---         ---
/.?(\d+(?:\.\d+)?)\s*(\w{0,3})\s*(.*)/
       ----------                
           |
           |
           |->this is needed since it would not always be 55.43..it could be 55
于 2012-12-01T12:40:02.797 に答える
2

問題はSPACE、価格と EUR/CAD/USD の間がオプションではないことです。*したがって、 のように a を追加するだけです\s*。これにより、そのスペースがオプションであることを RegEx に伝えます。

別のことは、分割ではなく、一致する必要があるということです。10 進数はオプションです。

デモの正規表現:[$€]?(\d+(?:\.\d+)?)\s*(\w{0,3})\s*(.*)

于 2012-12-01T12:42:49.870 に答える