2011-02-06 4 views
3

난 그냥 내 머리를 정규식 주위에, 어떤 도움을 감사!php preg_match 악몽

문자열 "1/10"또는 "2/10"또는 "2/18"등이 포함될 수도 있고 포함되지 않을 수도있는 문자열 데이터가 많습니다. 기본적으로 분자와 분모는 다를 수 있습니다. 그리고 더 복잡한 것들을 만들기 위해서, 어떤 데이터 입력 연산자 인 에 분자와 분모 사이에 공간을 두었습니다 !! 내 입력은 "x/y"또는 "x/y"또는 "x/y"또는 "x/y"또는 "x/y"일 수 있습니다 .... 그리고 아마도 더 많은 콤보가 있습니다 : (

x 및 y가 숫자인지 확인하고 그 사이에 "/"가 있으면 대문자로 대답하십시오.

PHP로 코딩 중이며 preg_match는 다음과 같습니다. 무엇을 사용해야합니다. 감사를 읽기.

+0

http://www.phpvideotutorials.com/regex/ –

+0

의 일부를 체크 아웃 [오픈 소스 RegexBuddy 대안] (http://stackoverflow.com/questions/89718/is-there-anything-like-regexbuddy-in-the-open-source-world)에 나와있는 도구를 사용하면 시작과 디자인에 도움이 될 것입니다 regexpressions. – mario

+0

도 1.2/4.2와 일치해야합니까? – Hamish

답변

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 
+0

화려한, 완벽한 작품! 그리고 당신이 준 멋진 테스트 케이스예요. – SIndhu

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

고마워,이 작품은 내 문자열에 x/y 변종 이외의 아무것도 포함되어 있지 않은 경우에만 작동합니다. – SIndhu

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

고마워,이 작품은 내 문자열에 x/y 변형 이외의 아무것도 포함되어 있지 않은 경우에만 작동합니다. – SIndhu

+0

x/y 변형을 포함하는 문자열과 일치 시키려면'^'및'$'을 제거하십시오. 그들은 각각 - 문자열의 시작과 문자열의 끝을 의미합니다. –

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)); 
     } 
    } 
} 
?> 

[email protected]:~/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. 

[email protected]:~/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

팁 주셔서 감사합니다 – SIndhu

+0

당신은 오신 것을 환영합니다! – Alfred