Я пытаюсь конвертировать некоторые цены:
[0] => EUR 19,06
[1] => 19, 70 €
[2] => 42.53 €
[3] => 18€65
[4] => 19,99 €
[5] => 18€65
[6] => 23€95
[7] => 19,99 €
в этот формат: xx.xx €
Я использую это регулярное выражение:
/(EUR|)\s*(\d{1,})\s*(\.|,|€|€|)\s*(\d{1,}|)\s*(€|€| €| €|)\s*/
и эта маска в preg_replace
:
$match = '${2}.$4 €';
Это работало отлично, КРОМЕ 5-й записи: 19,99 €.
Что не так с этим?
Я не вижу ошибок в вашем регулярном выражении, но оно может быть короче:
/^(?=.*(?:EUR|€|euro))\D*(\d+)\D*(\d*)\D*$/
и в качестве маскировать:
$match = '$1.$2 €';
Разъяснение:
^ # from start
(?=.* # positive lookahead
(?:EUR|€|euro) # look for one of these
) # to take sure it is about € money
\D*(\d+) # group at least + one digit in front of as many as possible non-digits
\D*(\d*) # again to take the cents (* means zero or more)
\D* # take the remaining not digits
$ # till the end
Надеюсь, поможет.
Других решений пока нет …