3 回答

TA貢獻1797條經驗 獲得超6個贊
您使用 a.表示千位和 a,表示小數,看起來您的文本是供人類使用的,因此在 a.和之前總會有一個數字,。
因此,您想要的是 1 個或多個數字,然后是 0 個或多個千組(a.后跟 3 個以上的數字),可選地后跟一個,和一個或多個數字。
One or more numbers: [0-9]+
0 or more thousand-groups: (\.[0-9]{3})*
Optionally a `,` and one or more numbers: (,[0-9]+)?
綜合: [0-9]+(\.[0-9]{3})*(,[0-9]+)?
$string = 'María vive en un pueblo de 25 957 habitantes y cobra 1859 euros al mes. OJO: no sé si os habéis fijado, pero los números del último ejemplo
no llevan un punto o una coma separando los millares (25.957 o 1.859). Sé que resulta extra?o, pero la nueva normativa de la R.A.E.
dice que los números de cuatro cifras NO llevarán separación (1859) y los números de cinco cifras o más NO llevarán ni puntos ni comas,
sino una separación (25 957 o 1 343 392). El 94% de los ni?os ha traído los deberes hechos. He pagado $50,95 dólares.';
$matches = [];
preg_match_all('/[0-9]+(\.[0-9]{3})*(,[0-9]+)?/', $string, $matches);
print_r($matches[0]);
/*
Array
(
[0] => 25
[1] => 957
[2] => 1859
[3] => 25.957
[4] => 1.859
[5] => 1859
[6] => 25
[7] => 957
[8] => 1
[9] => 343
[10] => 392
[11] => 94
[12] => 50,95
)
*/

TA貢獻1854條經驗 獲得超8個贊
可能不是最優雅的方法,但您可以使用基于您的第一個 REGEX 的兩個 preg_replace 函數并刪除小數而不用任何數字包裹它們,如下所示:
$numbers = preg_replace('/[^0-9\.,]+/', ' ', $string);
$decimals = preg_replace('/([^0-9][\.,])/', '', $numbers);
var_dump($decimals); // string(56) " 25 957 1859 25.957 1.859 1859 25 957 1 343 392 94 50,95"
現場示例:https : //3v4l.org/9aUCt
- 3 回答
- 0 關注
- 184 瀏覽
添加回答
舉報