Проблема с регулярным выражением в PHP: не удается найти $ C - PullRequest
1 голос
/ 02 февраля 2011

Я пытаюсь разобрать суммы в долларах по тексту на смешанном французском (канадском) и английском языках.Текст в UTF-8.Они используют $ C для обозначения валюты.По какой-то причине, когда я использую preg_match, ни '$', ни 'C' не могут быть найдены.Все остальное работает отлично.Есть идеи?

например, используйте preg_match_all('/\$C/u', $match) на "Спасибо за выплату 46,00 $ C" возвращается пусто.

Ответы [ 3 ]

2 голосов
/ 02 февраля 2011

Я думаю, что регулярное выражение не может найти этих персонажей, потому что их там нет.Если вы инициализируете строку следующим образом:

$source = "Thanks for a payment of 46,00 $C";

... (т.е. как строковый литерал в двойных кавычках), $C интерпретируется как имя переменной.Поскольку вы никогда не инициализировали эту переменную , она заменяется ничем в текущей строке.Вы должны либо использовать одинарные кавычки для инициализации строки, либо экранировать знак доллара с обратной косой чертой, как вы это сделали в регулярном выражении.

Кстати, это не может быть проблемой кодирования, потому что (вНапример, по крайней мере), все символы из набора символов ASCII.Будь то кодировка UTF-8, ISO-8859-1 или ASCII, двоичное представление строки будет идентичным.

0 голосов
/ 02 февраля 2011

Может быть, это поможет:

// assuming $text is the input string
$matches = array();
preg_match_all('/([0-9,\\.]+)\\s*\\$C/u', $text, $matches);
if ($matches) {
    $price = floatval(str_replace(',', '.', $matches[1][0]));
    printf("%.2f\n", $price);
} else {
    printf("No price found\n");
}

Просто убедитесь, что входная строка ($text) правильно декодирована в строку Unicode. (Например, если это в UTF-8, используйте функцию utf8_decode.)

0 голосов
/ 02 февраля 2011
preg_match_all('/\$C/u', 'Thanks for a payment of 46,00 $C', $matches);
print_r($matches);

отлично работает у меня:

Array
(
    [0] => Array
        (
            [0] => $C
        )

)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...