从字符串中提取十进制数



我想提取十进制数字(至少有2位小数)我试过了:

$myString = 'Rechnung WEEE-Reg.-Nr. DE 89633988, Batterie-Reg.-Nr. 21003868 LU-BIO-04 Amazon EU S.à r.l. - 38 avenue John F. Kennedy, L-1855 Luxembourg Sitz der Gesellschaft: L-1855 Luxemburg eingetragen im Luxemburgischen Handelsregister unter R.C.S. B 101818 • Stammkapital: 37.500 EUR Amazon EU S.à r.l., Niederlassung Deutschland – Marcel-Breuer-Str. 12, D-80807 München, Deutschland Sitz der Zweigniederlassung: München eingetragen im Handelsregister des Amtsgerichts München unter HRB 218574 USt-ID : DE 814584193 Seite 1 von 1 USt. y Zwischensumme (ohne USt.) USt. 19y 47,05 € 8,94 € USt. Gesamt 47,05 € 8,94 € Gesamtpreis 55,99 € Rechnungsdetails Bestelldatum 04 Oktober 2021 Bestellnummer XXXXXX Zahlungsreferenznummer XXXXX Verkauft von Amazon EU S.à r.l., Niederlassung Deutschland USt-IDNr. DE814584193 Rechnungsdatum /Lieferdatum 05 Oktober 2021 Rechnungsnummer XXXXX Zahlbetrag 55,99 € XXXXXX Um unseren Kundenservice zu kontaktieren, besuchen Sie www.amazon.de/contact-us Rechnungsadresse XXXXXXXX Lieferadresse XXXXXXX Verkauft von Amazon EU S.à r.l., Niederlassung Deutschland Marcel-Breuer-Str. 12 80807 München Deutschland USt-IDNr. DE814584193 Bestellinformationen Beschreibung Menge Stückpreis (ohne USt.) USt. y Stückpreis (inkl. USt.) Zwischensumme (inkl. USt.) AVM FRITZ!WLAN Mesh Repeater 1200 (Zwei Funkeinheiten: 5 GHz (bis zu 866 MBit/s), 2,4 GHz (bis zu 400 MBit/s), 1x Gigabit-LAN, deutschsprachige Version) ASIN: B07V3TKDV5 1 47,05 € 19yb 55,99 € 55,99 € Versandkosten 0,00 € 0,00 € 0,00 €'
preg_match_all('!d+.*d*!', $myString, $matches);

我输出:

[0] => Array
(
[0] => 89633988
[1] => 21003868
[2] => 04
[3] => 38
[4] => 1855
[5] => 1855
[6] => 101818
[7] => 37.500
[8] => 12
[9] => 80807
[10] => 218574
[11] => 814584193
[12] => 1
[13] => 1
)

唯一正确的值是37.500,我想在我的数组中。我错在哪里?:/

** UPDATE **

preg_match_all('!d+.d*!', $myString, $matches);
Array
(
[0] => Array
(
[0] => 89633988,
[1] => 12,
[2] => 47,05
[3] => 8,94
[4] => 47,05
[5] => 8,94
[6] => 55,99
[7] => 55,99
[8] => 2,4
[9] => 47,05
[10] => 55,99
[11] => 55,99
[12] => 0,00
[13] => 0,00
[14] => 0,00
)
)

更好但不完美。0、1、8错了

我想:

d*[.,]d{2,}

实现你想要的,可选的前导数,.,,然后是2个或更多的整数。

https://3v4l.org/MUIOv

更新:

如果不允许使用UK/Europe分隔符(,):

d*[.]d{2,}

应该工作。(可选前导数,.,然后2个或更多整数)

https://3v4l.org/cmoUt

结果只提供37.500

试试这个正则表达式模式:d*(,|.)d{2,3}

输出将是

[0] => Array
(
[0] => 37.500
[1] => 47,05
[2] => 8,94
[3] => 47,05
[4] => 8,94
[5] => 55,99
[6] => 55,99
[7] => 47,05
[8] => 55,99
[9] => 55,99
[10] => 0,00
[11] => 0,00
[12] => 0,00
)

如果你只需要"Stammkapital"然后使用这个规则:d*(,|.)d{2,3} EUR输出将是:

[0] => Array
(
[0] => 37.500 EUR
)
[1] => Array
(
[0] => 37.500
)

如果要匹配至少2位小数的正负小数,请尝试以下

/[+-]?([0-9]+[.,][0-9]{2,}|[.,][0-9]{2,})/

[+-]?匹配前导+或前导-字符,或者在小数点

之前不匹配它们。([0-9]+[.,][0-9]{2,}|[.,][0-9]{2,})一组匹配的小数点,如1.500.0001,点前没有数字,.,有两个或更多的小数点。