Найти число в строке

Lord Maverik
На сайте с 15.04.2003
Offline
471
728

Есть произвольная строка. Нужно извлечь из нее число. Делаю так:

$result = preg_replace("/[^\-\,\.\d]+/", "", $str);

Это для того, чтобы убрать все, не относящееся к числам.

Заэкранировал -,. на всякий случай. С регулярками у меня все плохо :(

Так вот, если строка:

и число это 3 было

то на выходе получаю -3.

и число это -3 было

то на выходе получаю --3.

Откуда берется этот дополнительный минус блин? (кодировка utf-8)

---------- Добавлено 19.11.2013 в 05:20 ----------

Что странно, strpos($str,'-') возвращает true, хотя минуса в строке и в помине нет.

Разобрался. Вот как всегда все самое простой еле находится. В строке действительно был минус, везде...

RedMall.Ru (https://redmall.ru) - Товары из Китая (Таобао, Tmall) с проверкой качества, скидка для форумчан 7% Партнерская программа 2 уровня: 5% + 5%. Подробнее. (https://redmall.ru/about/partner/)
Rulin
На сайте с 16.01.2008
Offline
133
#1

Несколько комментариев:

Lord Maverik:

$result = preg_replace("/[^\-\,\.\d]+/", "", $str);

В регулярках, в наборе символов (набор символов это то что заключается в квадратные кавычки []), не нужно экранировать символы которые являются частью языка регулярных выражений, т.е. в данном случае достаточно былобы так:

preg_replace("/[^-,.\d]+/", "", $str)

а в вашем примере у вас еще и знак обратного слеша найдется если он будет вплотную к цифрам стоять.

Также верхний апостров в наборе символов является отрицанием, т.е. найдется то чего нет среди перечисленного набора (апостров в не набора это начало строки), а вам нужно наоборот найти число, т.е. апостров не нужен для того чтобы найти число в строке

preg_match("/[-,.\d]+/", "", $str)

и также чтобы регулярки корректно работали с utf-8 строками, необходимо добавлять модификатор u (не путать с большой U) http://us3.php.net/manual/en/reference.pcre.pattern.modifiers.php

т.е. должно быть так:

preg_match("/[-,.\d]+/u", "", $str)

а вообще правильная регулярка для поиска чисел (целых, дробных с разделителем запятая или точка, или отрицательных) это (используем функцию preg_match для поиска):

"/(-?\d+(:?(:?\.|,)?\d+)?)/u"

правда если число имеет какое либо форматирование (например французкое 1 000 000), то оно не найдется или найдется не полностью, но в условии вашей задачи про это ничего не было сказано

И еще:

Lord Maverik:
(кодировка utf-8)
Lord Maverik:
strpos($str,'-')

Если у вас кодировка UTF-8 то нужно использовать мультибайтовые функции для работы со строками (например mb_strpos), т.к. стандартные функции типа strpos не рассчитаны на работу с мультибайтовыми кодировками, и у вас обязательно будут глюки с этим

Bitcoin Debit Card
Lord Maverik
На сайте с 15.04.2003
Offline
471
#2

Rulin, спасибо за советы, учту.

насчет отрицания, то там как раз эффект, когда

(например французкое 1 000 000)

найдется, ты мы как раз убираем все из строки, кроме этого.

в моем случае подразумевается, что в строке всего 1 число.

Rulin:
мультибайтовые функции для работы со строками (например mb_strpos)

обычно так и делаю, и проверил и так и эдак, а тут отписал не mb_, а просто strpos.

Rulin:
модификатор u

точно, про это вообще всегда забываю, спасибо :)

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий