1

私は文字列を持っています:

Product, Q.ty: 1, Price: 120.00

最初のコンマから最後の 2 桁の 10 進数 (.00) までのすべてを選択したい - または、言い換えると、Product変数である を選択します。変数ではないの, Q.tは文字列の最後の 2 文字であり、文字列の最後の 2 文字の前にドットが 2 桁あることも知られてい.ます。00-9

これを使用して文字列を一致させました:

preg_replace('/' . preg_quote(', Q.t') . '.*?' . preg_quote('.00') . '/', '', $data );

問題は、最後の 2 桁が 00 ではなく、50、40、30 などの場合に失敗することです。1 桁の「0」で同じ正規表現を使用すると、それがキャッチされるため、どちらも機能しません。前の例のように文字列の最初の 0 であり、残りの 0 は除外されます。

この式を調整して、「.」が前にある数字のグループをキャッチする方法 ドット?

*もう 1 つ注意: この preg_replace は foreach ループ内にあります。一部のデータは、渡そうとしているパターンとまったく一致しません。これは問題ないので、そのような場合は文字列をそのまま印刷できます。しかし、一致する foreach のケースでは、文字列の一部を何も置き換えたくない*

ありがとうございました

4

5 に答える 5

2

私は、誰かが (いつもいる) 「あなたは と でピースを手に入れることができる」と言うだろうと考えましstr_replace()explode()。ただし、速くはありません。

<?php

$string = "Product, Q.ty: 1, Price: 120.00";
$removals = array(",",":");


$stime = microtime();
    $nstring = str_replace($removals,'',$string);
    $parts = explode(" ",$nstring);

echo microtime()-$stime."secs\n";
    print_r($parts);

$pattern = "!^([A-Za-z]+),\s([A-Za-z.]+)\:\s([0-9]+),\s([A-Za-z]+):\s([0-9.]+)$!";

$ptime = microtime();
    $m = preg_match($pattern,$string,$matches);
echo microtime()-$ptime."secs\n";

print_r($matches);

?>

出力

4.0999999999958E-5secs
Array
(
    [0] => Product
    [1] => Q.ty
    [2] => 1
    [3] => Price
    [4] => 120.00
)
3.5000000000007E-5secs
Array
(
    [0] => Product, Q.ty: 1, Price: 120.00
    [1] => Product
    [2] => Q.ty
    [3] => 1
    [4] => Price
    [5] => 120.00
)

より文字通りのアプローチを使用しても、$string逸脱しない限り、 preg_match 関数のパフォーマンスは向上しません。

$pattern = "!^(Product), (Q\.ty): ([0-9]+), (Price): ([0-9.]+)$!";
于 2013-07-24T15:35:41.830 に答える
2
 /([^,]*), Q\.ty: (\d*), Price: (\d*\.\d{2})/

これを使用([^,]*),すると、文字列内のコンマが最初の区切り文字として使用されます。これにより、文字列の最初のコンマまでがキャプチャされ、2 番目の一致は数量になり、最後の一致は価格になります。

したがって、提供された文字列:

 Product, Q.ty: 1, Price: 120.00

戻ります

$1 = Product
$2 = 1
$3 = 120.00

ちなみに、 Q.ty の Q の後のその期間が、あなたの例で意図的なものなのか、単なるタイプミスなのかはわかりません。

于 2013-07-24T15:12:52.413 に答える
1

リテラルのドットが必要な場合は、エスケープする必要があります: \.

于 2013-07-24T14:48:28.283 に答える