2013-06-02 2 views
2

PHP에서 if 문에 사용할 정규 표현식을 작성하려고합니다. 문자열에 적어도 1 +, -, * 또는 /를 포함하고 있는지 확인하십시오. 최소 2 개의 숫자. 그 사이에는 여러 개의 공백이있을 수 있습니다.적어도 하나의 기호와 적어도 2 개의 숫자를 일치시키는 정규식

가장 좋은 방법은 무엇입니까?

아래 정규식을 작성하려고했지만 테스트 케이스와 일치하지 않는 것 같습니다.

내가 사용 정규식은 : m/[0-9]{2,}[=-*/]+/ 통과 할 몇 가지 테스트 케이스

:

  1. 2 +2
  2. 5 * 3
  3. 6-8

나의 궁극적 인 목표는 PHP로 계산기를 만드는 것이고, 지금은 어떤 입력이 유효한 수학적 입력인지 결정하려고하고있다./유효한 수학적 표현과 그렇지 않은 것.

+4

Lex보다는 regexp 해킹 – Ven

+0

[strtok] (http://php.net/manual/en/function.strtok.php)와 같은 것을 사용하는 것이 좋습니다. – raina77ow

답변

1

테스트 결과와 일치합니다. 당신은 문자 2 번 이상 일치 의미 {2,}를 사용하고 있기 때문에

/^ 
[0-9]+ # first number 
\s*  # any whitespace 
[+*\/-] # operand 
\s*  # any whitespace 
[0-9]+ # second number 
$/x 
+0

문자 클래스에서'+ * /'를 이스케이프 할 필요는 없지만 문자 클래스의 중간에 있다면'-'를 이스케이프해야합니다. 그렇지 않으면 범위를 지정합니다! 예를 들어, ','는 [ascii 테이블] (http://www.asciitable.com/)에 따라'*'와'/'의 범위에 있기 때문에'8, 5'가 매치됩니다. [온라인 데모] (http://regex101.com/r/jI5oR0). 따라서'[+ */-]'를 사용하면'-'를 이스케이프 할 필요가 없지만 [구분 기호] (http://regex101.com/r/)로 사용하면 슬래시를 벗어날 필요가 있습니다. xV9mG9). – HamZa

+1

@HamZa : 고마워요! 고정 – Evert

+0

@HamZa : 경고 : preg_match() : 알 수없는 수식어 '-';) 그 대시를 벗어날 것입니다. – Evert

1

귀하의 정규식 지금까지 한 자리 번호와 일치하지 않습니다.
그럼 여기이 정규식에서 살펴 보자 :
#(\d+)\s*([+/*-])\s*(\d+)#

  • #을 :
  • (\d+) 구분 기호 : 그것을 숫자를 한 번 이상 일치하고 그룹.
  • \s* : 하나 + 또는 - 또는 * 또는 / 한 시간과 그룹을 일치 그것을
  • \s* : 공간을 일치 0 번 이상
  • (\d+)
  • : 0 번 이상
  • ([+/*-])
  • 공간을 일치 일치 한 번 이상 숫자를 입력 한 다음 그룹화하십시오.
  • # : 구분

는 이제 여기에 몇 가지 PHP - 푸를 사용하자 함수는 내가 here 사용 :

$input = '2 +2 
5*3 
6 - 8'; 

$output = preg_replace_callback('#(\d+)\s*([+/*-])\s*(\d+)#', function($m){ 
    return $m[1].' '.$m[2].' '.$m[3].' = '. mathOp($m[2], (int)$m[1], (int)$m[3]); 
}, $input); // You need PHP 5.3+. Anonymous function is being used here ! 
echo $output; 

function mathOp($operator, $n1, $n2){ 
    if(!is_numeric($n1) || !is_numeric($n2)){ 
     return 'Error: You must use numbers'; 
    } 
    switch($operator){ 
     case '+': 
      return($n1 + $n2); 
     case '-': 
      return($n1 - $n2); 
     case '*': 
      return($n1 * $n2); 
     case '/': 
      if($n2 == 0){ 
       return 'Error: Division by zero'; 
      }else{ 
       return($n1/$n2); 
      } 
     default: 
      return 'Unknown Operator detected'; 
    } 
} 

출력 :

2 + 2 = 4 
5 * 3 = 15 
6 - 8 = -2 

조언 :
,691을음수, 괄호, 로그 및 cos/sin 함수가 복잡해 지므로 파서를 사용하는 것이 더 낫습니다.

+0

고맙습니다. 설명과 도움을! 이것은 많은 도움이되었습니다. PHP를위한 수학 파서 (parser)를 어디에서 구할 수 있습니까? – JayGatz

+0

@JayGatz 미안 내가 시도한 것을 모르겠다. 아마 하나를 찾아서 시도해야 할 것이다. 또한 eval()을 사용하는 솔루션을 신중히 선택하고 보안 문제가있을 수 있으므로 테스트하십시오. – HamZa

+0

@JayGatz 좋아요. [Dave] (http://stackoverflow.com/users/889949)에게 물었고 [그가 제안한 내용] (http://chat.stackoverflow.com/transcript/message/9773856#9773856)이 있습니다. – HamZa

관련 문제