Я хочу извлечь числа из строки, содержащей числа и буквы, такие как:
"In My Cart : 11 items"
Я хочу здесь получить номер 11
или любой другой номер.
$str = 'In My Cart : 11 12 items'; preg_match_all('!\d+!', $str, $matches); print_r($matches);
Если вы просто хотите отфильтровать все, кроме цифр, проще всего использовать filter_var :
$str = 'In My Cart : 11 items'; $int = filter_var($str, FILTER_SANITIZE_NUMBER_INT);
preg_replace('/[^0-9]/', '', $string);
Это должно сделать лучше работу ..!
Использование preg_replace
:
$str = '(111) 111-1111'; $str = preg_replace('/\D/', '', $str); echo $str;
Выход: 1111111111
Для плавающих чисел,
preg_match_all('!\d+\.*\d*!', $string ,$match);
У меня нет для этого кредита, но я просто должен поделиться им. Это регулярное выражение будет получать числа из строки, включая десятичные точки / места, а также запятые:
/((?:[0-9]+,)*[0-9]+(?:\.[0-9]+)?)/
Процитировано здесь:
php – regex – как извлечь число с десятичной точкой (точка и запятая) из строки (например, 1,120.01)?
Вы можете использовать preg_match :
$s = "In My Cart : 11 items"; preg_match("|\d+|", $s, $m); var_dump($m);
Использование preg_replace
$str = 'In My Cart : 11 12 items'; $str = preg_replace('/\D/', '', $str); echo $str;
Вы можете использовать следующую функцию:
function extract_numbers($string) { preg_match_all('/([\d]+)/', $string, $match); return $match[0]; }
preg_match_all('!\d+!', $some_string, $matches); $string_of_numbers = implode(' ', $matches[0]);
Первый аргумент в implode в этом конкретном случае говорит «отделить каждый элемент в совпадениях [0] с одним пробелом». Implode не будет помещать пробел (или любой другой ваш первый аргумент) до первого числа или после последнего числа.
Что-то еще, что нужно отметить, это $ matches [0], где найден массив совпадений (которые соответствуют этому регулярному выражению).
Для дальнейшего уточнения того, что другие индексы в массиве см. В: http://php.net/manual/en/function.preg-match-all.php
попробуйте это, используйте preg_replace
$string = "Hello! 123 test this? 456. done? 100%"; $int = intval(preg_replace('/[^0-9]+/', '', $string), 10); echo $int;
DEMO
Используйте эту функцию в PHP для извлечения любого количества одной строки
/** * Return the all number in a array * @param {string} $string * * @return {array} */ function number_in_string($string){ try { if (!is_string($string)) throw new Exception("Error : Param Type"); preg_match_all("/\d+/", $string, $matches); // Return the all coincidences return $matches[0]; } catch (Exception $e) { echo $e->getMessage(); } }
Вызовите функцию
$numbers = number_in_string("a-25-65_52");
воспроизводить
array(3) { [0]=> string(2) "25" [1]=> string(2) "65" [2]=> string(2) "52" }
Распечатайте один элемент массива echo, для этого примера
echo $numbers[0]; // 25 echo $numbers[1]; // 65 echo $numbers[2]; // 52
другой способ (unicode string even):
$res = array(); $str = 'test 1234 555 2.7 string ..... 2.2 3.3'; $str = preg_replace("/[^0-9\.]/", " ", $str); $str = trim(preg_replace('/\s+/u', ' ', $str)); $arr = explode(' ', $str); for ($i = 0; $i < count($arr); $i++) { if (is_numeric($arr[$i])) { $res[] = $arr[$i]; } } print_r($res); //Array ( [0] => 1234 [1] => 555 [2] => 2.7 [3] => 2.2 [4] => 3.3 )
В зависимости от вашего варианта использования это также может быть вариант:
$str = 'In My Cart : 11 items'; $num = ''; for ($i = 0; $i < strlen($str); $i++) { if (is_numeric($str[$i])) { $num .= $str[$i]; } } echo $num; // 11
Хотя я бы согласился с регулярным выражением или filter_var()
было бы более полезно в заявленном случае.
для utf8 str:
function unicodeStrDigits($str) { $arr = array(); $sub = ''; for ($i = 0; $i < strlen($str); $i++) { if (is_numeric($str[$i])) { $sub .= $str[$i]; continue; } else { if ($sub) { array_push($arr, $sub); $sub = ''; } } } if ($sub) { array_push($arr, $sub); } return $arr; }