Я не могу найти подходящее регулярное выражение, чтобы извлечь только числа из строки.
Рассмотрим следующую строку:
$string = "8x2.1 3x2";
Я хочу извлечь 2.1, я попробовал следующее, но это дает мне целые числа и числа с плавающей запятой:
preg_match_all('/[0-9,]+(?:\.[0-9]*)?/', $string, $matches);
Затем я попытался использовать is_float
проверять число с плавающей запятой, но по некоторым причинам это также возвращает целые числа. Есть идеи?
Спасибо
Рассмотрим этот простой пример:
<?php
$input = "8x2.1 3x2";
preg_match('/\d+\.\d+/', $input, $tokens);
print_r($tokens);
Соответствует «одной или нескольким цифрам, за которыми следуют ровно одна полная остановка и снова одна или несколько цифр».
Вывод, очевидно, таков:
Array
(
[0] => 2.1
)
Ваше регулярное выражение соответствует float и целым числам, и даже строкам, состоящим только из запятых.
[0-9,]+
— 1 или более цифр или ,
(?:\.[0-9]*)?
— одна или ноль последовательностей .
+ ноль или более цифр.Тебе нужно
/\d+\.\d+/
Это будет соответствовать 1+ цифр, .
и 1+ цифр.
Или, чтобы также сопоставить отрицательные и положительные числа с плавающей запятой, добавьте -
в начале:
/-?\d+\.\d+/
подробности
-?
— один или ноль дефисов (?
средства соответствовать одному или нулю вхождений)\d+
— одна или несколько цифр (+
средства сопоставить одно или несколько вхождений, \d
соответствует цифре символа)\.
— буквальная точка (поскольку точка в регулярном выражении является специальным метасимволом, ее следует экранировать для обозначения буквальной точки)\d+
— одна или несколько цифр$string = "8x2.1 3x2";
preg_match_all('/\d+\.\d+/', $string, $matches);
print_r($matches[0]);
// => Array ( [0] => 2.1 )
Бонусное регулярное выражение, которое также будет соответствовать только числам с плавающей запятой с необязательным показателем степени (вариант регулярного выражения в regular-expressions.info):
/[-+]?\d+\.\d+(?:e[-+]?\d+)?/i
Здесь вы можете увидеть, что дополнительный +
или же -
подбирается первым ([-+]?
), затем используется тот же шаблон, что и выше, затем добавляется необязательная группа без захвата (?:...)?
соответствует 1 или 0 вхождений следующей последовательности: e
или же E
(поскольку /i
является регистронезависимым модификатором), [-+]?
соответствует необязательному +
или же -
и \ d + `соответствует 1+ цифрам.