我想提取十进制数字(至少有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
,点前没有数字,.
和,
有两个或更多的小数点。