preg_match: пытается определить числовые форматы - PullRequest
1 голос
/ 29 сентября 2011

Я пытаюсь идентифицировать не только «числа» в строке, но и помечать, какой это тип числа, например «Общее», «Дробь», «Процент», «Соотношение» и т. Д.

Теперь, если я использую инструментвроде http://rubular.com/, мои шаблоны работают нормально.

Правила?

([-+]?)([0-9]+)([,+]?)([.]?)       //General
([-+]?[0-9.,]+[%])                 //Percent
([0-9]+[\/][0-9]+(?:st|nd|rd|th))  //Fraction
([-+]?[0-9.,]+[:][-+]?[0-9.,]+)    //Ratio  

Строки для проверки?

1  
1,000  
1.000  
-50.5  
-1:+3  
1,200.6:3.9  
+2:-4  
1/5th  
25%  
25.76%  
1,001%  

Это когда я помещаю их в php (if / elseif) конструкции, я всегда получаю "общее" число?

if (preg_match('/([-+]?[0-9.,]+[%])/',$string)) {
    echo " PERCENTILE ";

} elseif (preg_match('/([0-9]+[\/][0-9]+(?:st|nd|rd|th))/',$string)) {
    echo " FRACTION ";

} elseif (preg_match('/([-+]?[0-9.,]+[:][-+]?[0-9.,]+)/',$string)) {
    echo " RATIO ";

} elseif (preg_match('/([-+]?)([0-9]+)([,+]?)([.]?)/',$string)) {
    echo " CARDINAL ";

} else {
    echo " GENERAL ";
}

Независимо от того, что это повторяет "КАРДИНАЛ".

Да, я попытался переключить порядок (сначала Карта / Общее, затем остальные).Да, я пытался сделать их независимыми IF (), и в обратном порядке (сначала самое общее).

Кажется, ничего не работает.Даже проверка Single IF для любого из форматов просто не удалась.Либо мои правила напичканы, либо я делаю что-то явно неправильное.

Ответы [ 3 ]

2 голосов
/ 29 сентября 2011

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

test.php:

$nums = array(
  '1',
  '1,000',
  '1.000',
  '-50.5',
  '-1:+3',
  '1,200.6:3.9',
  '+2:-4',
  '1/5th',
  '25%',
  '25.76%',
  '1,001%'
);
foreach ($nums as $string) {
  echo $string.': ';
  if (preg_match('/([-+]?[0-9.,]+[%])/',$string)) {
    echo " PERCENTILE ";
  } elseif (preg_match('/([0-9]+[\/][0-9]+(?:st|nd|rd|th))/',$string)) {
    echo " FRACTION ";
  } elseif (preg_match('/([-+]?[0-9.,]+[:][-+]?[0-9.,]+)/',$string)) {
    echo " RATIO ";
  } elseif (preg_match('/([-+]?)([0-9]+)([,+]?)([.]?)/',$string)) {
    echo " CARDINAL ";
  } else {
    echo " GENERAL ";
  }
  echo "\n";
}

$ php test.php

1:  CARDINAL 
1,000:  CARDINAL
1.000:  CARDINAL
-50.5:  CARDINAL
-1:+3:  RATIO 
1,200.6:3.9:  RATIO
+2:-4:  RATIO 
1/5th:  FRACTION 
25%:  PERCENTILE
25.76%:  PERCENTILE 
1,001%:  PERCENTILE
2 голосов
/ 29 сентября 2011

Попробуйте окружить каждое регулярное выражение ^ и $, чтобы оно совпадало, только если оно совпадает со всей строкой или строкой. Без них, если регулярное выражение соответствует части числа, это все равно совпадение. Например, '1,000' соответствует вашему регулярному выражению для чисел CARDINAL, /([-+]?)([0-9]+)([,+]?)([.]?)/, потому что оно соответствует подстроке '1,'. Если вы добавите ^ и $, как в /^([-+]?)([0-9]+)([,+]?)([.]?)$/, то оно больше не будет совпадать.

<?php
function check_format($string) {
    if (preg_match('/^([-+]?[0-9.,]+[%])$/',$string)) {
        echo " PERCENTILE ";

    } elseif (preg_match('/^([0-9]+[\/][0-9]+(?:st|nd|rd|th))$/',$string)) {
        echo " FRACTION ";

    } elseif (preg_match('/^([-+]?[0-9.,]+[:][-+]?[0-9.,]+)$/',$string)) {
        echo " RATIO ";

    } elseif (preg_match('/^([-+]?)([0-9]+)([,+]?)([.]?)$/',$string)) {
        echo " CARDINAL ";

    } else {
        echo " GENERAL ";
    }
}

array_map("check_format", array(
    "1",
    "1,000",
    "1.000",
    "-50.5",
    "-1:+3",
    "1,200.6:3.9",
    "+2:-4",
    "1/5th",
    "25%",
    "25.76%",
    "1,001%"
    ));

выходы:

 CARDINAL  GENERAL  GENERAL  GENERAL  RATIO  RATIO  RATIO  FRACTION  PERCENTILE  PERCENTILE  PERCENTILE 

РЕДАКТИРОВАТЬ: Это может быть лучше регулярное выражение для чисел CARDINAL:

/^([-+]?)([0-9]+)(?:,?[0-9]{3})*([.]?)$/
0 голосов
/ 26 октября 2012
Please have a look on this .

<?php 
$num = 12.20

$num = floatval(preg_replace('/[^\d.]/', '', num));

// output will be 12.2

//it always replace zero and you have number 12.00 then output will be 12
$num = 12.00

$num = floatval(preg_replace('/[^\d.]/', '', num));
// output will be 12
...