php preg_match噩梦

时间:2011-02-06 23:25:45

标签: php regex preg-match

我无法理解正则表达式,任何帮助表示赞赏!

我有很多字符串数据,可能包含也可能不包含字符串“1/10”或“2/10”或“2/18”等。基本上,分子和分母都可能有所不同。为了使事情变得更复杂,一些数据输入操作员可能在分子和分母之间放置了一个空格! 所以我的意见可能是: “x / y”或“x / y”或“x / y”或“x / y”或“x / y”......以及可能更多的组合:(

在任何这些情况下,我希望确定x和y是否为数字,以及它们之间是否有“/”斜杠。在正则表达式上绝望,请帮助

我在php编码,我想preg_match是需要使用的。 谢谢你的阅读。

4 个答案:

答案 0 :(得分:4)

$pattern = "%(\d+) */ *(\d+)%";

$test = array(
    'half is 1/2',
    '13/100 is your score',
    'only 23 /90 passed',
    'no idea here:7/ 123',
    '24 / 25',
    '1a/2b'
);

foreach($test as $t){
    if(preg_match($pattern, $t, $matches))
        echo "PASS: n:$matches[1], d:$matches[2]\n";
    else
        echo "FAIL: $t\n";
}

输出:

PASS: n:1, d:2
PASS: n:13, d:100
PASS: n:23, d:90
PASS: n:7, d:123
PASS: n:24, d:25
FAIL: 1a/2b

答案 1 :(得分:1)

if(preg_match('~^[0-9]+\s*/\s*[0-9]+$~',trim($subject))) {
  // valid
} 

答案 2 :(得分:0)

if(preg_match('@^\s?[0-9]+\s?\/\s?[0-9]+\s?$@', $s) {
     ...
}

答案 3 :(得分:0)

我认为你应该不惜一切代价避免使用regexp。您应该(可能)的几个案例:

  • 您是regexp的专家。如果你是你,那么你可能应该使用正则表达式,因为它可能是更快更简洁的代码。虽然我认为可读性会很糟糕。
  • 您需要提高效果。

否则我的建议是不要使用它!

  

在任何这些情况下,我希望   确定x和y是否是数字,和   如果它们之间有“/”斜杠。   在正则表达式上绝望,请帮助

如何解决您的问题:

<?php

class Verify {
    public static function numbers($str) {
        $explode = explode("/", $str);

        foreach($explode as $elm) {
            if (!filter_var($elm, FILTER_VALIDATE_INT)) {
                return false;
            }
        }
        return true;
    }
}
class StackTest extends PHPUnit_Framework_TestCase {
    public function testBothPartsAreNumbers() {
        $array = array(
            "1/2",
            "1 / 2",
            "1/ 2",
            "1 /2"
        );
        foreach($array as $elm) {
            $this->assertTrue(Verify::numbers($elm));
        }
    }

    public function testOneOfThemMightBeNotANumber() {
        $array = array(
            "1/a",
            "a/1",
            "1 / a",
            "b/2",
            "b/a",
            "1/2.1",
        );
        foreach($array as $elm) {
            $this->assertFalse(Verify::numbers($elm));
        }
    }
}
?>

alfred@alfred-laptop:~/php/stackoverflow/4916920$ php -v
PHP 5.3.3-1ubuntu9.3 with Suhosin-Patch (cli) (built: Jan 12 2011 16:08:14) 
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies
with Xdebug v2.1.0, Copyright (c) 2002-2010, by Derick Rethans

# We need at least PHP5.2 for filter.

alfred@alfred-laptop:~/php/stackoverflow/4916920$ phpunit NumberTest.php 
PHPUnit 3.5.10 by Sebastian Bergmann.

..

Time: 0 seconds, Memory: 3.50Mb

OK (2 tests, 10 assertions)