PHP регулярное выражение, чтобы найти незашифрованный символ евро

Я в PHP. Я хотел бы найти числа в предложении, которые начинаются с символа валюты и возвращают число. Для поиска "я потратил 100 евро на обувь" и вернем "100".

У меня это работает за $ и £:

'/[$£]([0-9.]{1,})/'

Но добавление символа евро не работает. (Предложения приходят из разобранных писем, поэтому мне не нужно искать €);

preg_match_all('/[€]([0-9.]{1,})/', $sentence, $match);

На SO я нашел следующее: регулярное выражение для валюты (евро), но оно не кодирует символ евро.

Чтобы закодировать символ евро, я попытался:

/[\x{20ac}]([0-9.]{1,})/u
"[^-a-zA-Z0-9.:,!+£$ \\ ". chr(164) ."]"

Но не могу понять это. Любая помощь?

2 ответа

Решение

Когда я вставлю это в:

 echo preg_match("#€[0-9]{1,}#", "€1" )?1:0;

я получил 1, так что вам может не понадобиться Unicode. Но если вы все же хотите использовать UTF-8, я нашел это как комментарий в документации PHP.

function unichr($u) {
    return mb_convert_encoding('&#' . intval($u) . ';', 'UTF-8', 'HTML-ENTITIES');
}

Чтобы получить €, звоните unichr(8364), Используйте это вместо знака евро выше, и вам будет хорошо. (Я чувствую, что должен заметить: что я тестировал обе версии как Unicode:

preg_match("#".unichr(8364)."\s*([0-9]{1,})#u", unichr(8364). "1" )?1:0;

Вы можете захотеть сделать str_replace('€', unichr(8364), $str); первый...

PS. Вы, вероятно, также хотите учесть пробелы и десятичные числа: #€\s*([0-9]{1,}(\.?[0-9]{2}))#

Как насчет замены символа евро чем-то другим? Например:

$str = 'I spent €100 on shoes.';
$tempStr = str_replace('€', '$', $str);
//$tempStr now contains: I spent $100 on shoes.

preg_match_all('/[€]([0-9.]{1,})/', $tempStr, $match);
Другие вопросы по тегам