Как извлечь только числа с плавающей запятой (десятичные дроби) из строки, которая также включает целые числа

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

$string = "8x2.1 3x2";

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

preg_match_all('/[0-9,]+(?:\.[0-9]*)?/', $string, $matches);

Затем я попытался использовать is_float проверять число с плавающей запятой, но по некоторым причинам это также возвращает целые числа. Есть идеи?
Спасибо

1

Решение

Рассмотрим этот простой пример:

<?php
$input = "8x2.1 3x2";
preg_match('/\d+\.\d+/', $input, $tokens);
print_r($tokens);

Соответствует «одной или нескольким цифрам, за которыми следуют ровно одна полная остановка и снова одна или несколько цифр».

Вывод, очевидно, таков:

Array
(
[0] => 2.1
)
6

Другие решения

Ваше регулярное выражение соответствует float и целым числам, и даже строкам, состоящим только из запятых.

  • [0-9,]+ — 1 или более цифр или ,
  • (?:\.[0-9]*)? — одна или ноль последовательностей . + ноль или более цифр.

Тебе нужно

/\d+\.\d+/

Это будет соответствовать 1+ цифр, . и 1+ цифр.

Или, чтобы также сопоставить отрицательные и положительные числа с плавающей запятой, добавьте - в начале:

/-?\d+\.\d+/

подробности

  • -? — один или ноль дефисов (? средства соответствовать одному или нулю вхождений)
  • \d+ — одна или несколько цифр (+ средства сопоставить одно или несколько вхождений, \d соответствует цифре символа)
  • \. — буквальная точка (поскольку точка в регулярном выражении является специальным метасимволом, ее следует экранировать для обозначения буквальной точки)
  • \d+ — одна или несколько цифр

PHP демо:

$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+ цифрам.

3

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector