2015-11-25 3 views
0

Я пытаюсь преобразовать некоторые цены:Форматирование евро цены в PHP

[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*/ 

и эту маску в a preg_replace:

$match = '${2}.$4 €'; 

Он отлично работал за исключением 5-й записи: 19,99 €. Что не так с этим?

+0

Кажется, работает со мной, https://regex101.com/r/mA7mX5/2 https://eval.in/475914 Вы также можете декодировать объекты в строке перед обработкой с помощью регулярного выражения. – chris85

ответ

0

Я не вижу каких-либо ошибок в регулярных выражениях, но это может быть короче:

/^(?=.*(?: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 

Regex live here.

Надеюсь, что это поможет.

+0

Да, вы решили мою проблему! Спасибо. – Kernel

+0

@Kernel. Я рад помочь .. также, вы можете отметить, как принято, если это вам помогло :) –

+0

У меня проблема с новой ценой: 85 € Я обновил регулярное выражение: https://regex101.com/r/vC7jB9/2, но я не знаю, как заполнить вторую группу захвата нулями, если она пуста? – Kernel