php preg_match кошмар - PullRequest
       3

php preg_match кошмар

3 голосов
/ 07 февраля 2011

Я просто не могу разобраться в регулярных выражениях, любая помощь приветствуется!

У меня есть много строковых данных, которые могут содержать или не содержать строки "1/10", "2/10" или "2/18" и т. Д. В принципе, числители и знаменатели могут различаться. И чтобы усложнить задачу, некоторые операторы ввода данных могут поставить пробел где-нибудь между числителями и знаменателями !! Так что мой вклад может быть: «x / y» или «x / y» или «x / y» или «x / y» или «x / y» .... и, вероятно, больше комбинаций: (* ​​1005 *

В любом из этих случаев я хотел бы определить, являются ли x и y числами и есть ли между ними косая черта "/". Я безнадежен в регулярных выражениях, пожалуйста, помогите

Я пишу в php, и я думаю, preg_match - это то, что нужно использовать. Спасибо за чтение.

Ответы [ 4 ]

4 голосов
/ 07 февраля 2011
$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 голос
/ 07 февраля 2011
if(preg_match('~^[0-9]+\s*/\s*[0-9]+$~',trim($subject))) {
  // valid
} 
0 голосов
/ 07 февраля 2011

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

  • Вы являетесь экспертом в регулярных выражениях. Если вы вы, то, вероятно, вам следует использовать регулярное выражение, потому что он, вероятно, будет быстрее и более кратким кодом. Хотя читабельность, по моему мнению, будет отстойной.
  • Вам нужно улучшить производительность.

В противном случае мой совет не использовать его!

В любом из этих случаев я бы хотел определить, являются ли 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)
0 голосов
/ 07 февраля 2011
if(preg_match('@^\s?[0-9]+\s?\/\s?[0-9]+\s?$@', $s) {
     ...
}
...