2010-05-03 3 views
9

에 부울 논리의 문자열을 구문 분석하는 방법 : 공용 멤버 함수내가 같은 문자열 값을 반환하는 개인 멤버 함수와 PHP 클래스를 짓고 있어요 PHP

'true && true || false' 

. (이 문자열은 일부 정규식 일치 및 속성 조회의 결과입니다.) PHP에서 반환 된 논리를 구문 분석하고 구문 분석 된 논리의 부울 결과가 true인지 false인지 여부를 앞에서 설명한 공용 함수에서 반환하도록해야합니다.

나는 eval()을 시도했지만 아무 출력도 얻지 못했다. 내가 boolean 반환을 typecasting 시도 ...하지만 거기에 방법을 typecast 연산자 ... hehe 어떤 아이디어? (더 자세한 정보가 필요하면 알려주십시오.)

+1

당신은 eval ("return". $ mystring)을 시도 했습니까? – Jasper

답변

28

이 질문에 우연히 만났지 만 eval을 사용하는 것에 대해 상당히 불안해하며 더 나은 솔루션을 찾기로했습니다.

내가 발견 한 것은 FILTER_VALIDATE_BOOLEAN 플래그 (of which there are many)를 전달할 때 PHP의 filter_var 함수에 대한 또 다른 멋진 사용법입니다.

<?php 

/** 
* Uses PHP's `filter_var` to validate an object as boolean 
* @param string $obj The object to validate 
* @return boolean 
*/ 
function parse_boolean($obj) { 
    return filter_var($obj, FILTER_VALIDATE_BOOLEAN); 
} 

그리고, 약간의 테스트 :

/** 
* Let's do some testing! 
*/ 
$tests = array (
    "yes", 
    "no", 
    "true", 
    "false", 
    "0", 
    "1" 
); 

foreach($tests as $test) { 

    $bool = parse_boolean($test); 

    echo "TESTED: "; 
    var_dump($test); 

    echo "GOT: "; 
    var_dump($bool); 

    echo "\n\n"; 

} 

이 "한 줄"함수는 부울에 문자열 (또는 다른) 개체를 변환 안전하게에서 잘 할 것 같다 출력 :

/* 
TESTED: string(3) "yes" 
GOT: bool(true) 


TESTED: string(2) "no" 
GOT: bool(false) 


TESTED: string(4) "true" 
GOT: bool(true) 


TESTED: string(5) "false" 
GOT: bool(false) 


TESTED: string(1) "0" 
GOT: bool(false) 


TESTED: string(1) "1" 
GOT: bool(true) 
*/ 

충분히 깊게 보지 못했지만이 솔루션은 eval 라인을 사용하여 어딘가에 의존 할 수 있습니다. 그러나 을 보내고 난 후에도 여전히 입력을 살균 처리 할 것이라고 가정 했으므로 여전히 평이한 것을 사용하는 편이 낫습니다. eval 통해.

+3

이것은 원래 문제를 해결하지 못합니다 (운영자는 처리되지 않습니다). 'filter_var ('true && true', FILTER_VALIDATE_BOOLEAN)'false'를 반환합니다. –

+4

물론입니다. 이것은 내 질문에 대한 오해 였고, 받아 들인 해결책으로 표시를 해제해야합니다. – gpmcadam

+1

이것은 PHP 워드 프로세서에 있어야합니다 ... – Tjorriemorrie

2

eval()은 귀하의 경우에는 괜찮은/좋은 해결책이라고 가정 해 봅시다.

class Foo { 
    private function trustworthy() { 
    return 'true && true || false'; 
    } 

    public function bar() { 
    return eval('return '.$this->trustworthy().';'); 
    } 
} 

$foo = new Foo; 
$r = $foo->bar(); 
var_dump($r); 

인쇄 bool(true)

+0

도움 주셔서 감사합니다. 나는 정말로 'return'을 잊고 있었다. .. hehe – TheOddLinguist

4

eval()이 완벽하게 잘 작동하지만, 당신이 뭔가를 반환하도록 지시해야 기억합니다.

$string = "true && true || false"; 
$result = eval("return (".$string.");"); // $result will be true 

eval()에 직접 입력하는 경우 사용자 입력을 위생 처리해야합니다.

+0

고맙다; 나는 '돌아 오는 길'을 잊고 있었다. 문자열은 다소 긴밀한 정규 표현식의 결과이므로 괜찮을 것이라고 생각합니다. 이 작업이 이제는 위생 처리를 다시 평가할 것입니다. 다시 한번 감사드립니다. – TheOddLinguist

-3

(문자열) true & & true || false

관련 문제