How to parse a string of boolean logic in PHP How to parse a string of boolean logic in PHP php php

How to parse a string of boolean logic in PHP


Just stumbled upon this question, but being fairly uneasy about using eval, I decided to keep looking for a better solution.

What I discovered is yet another wonderful use for PHP's filter_var function, when passing in the FILTER_VALIDATE_BOOLEAN flag (of which there are many).

This "one line" function seems to do well at safely converting a string (or other) object to a boolean:

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

And, a little testing:

/** * 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";}

Output:

/*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)*/

I haven't looked deep enough, but it's possible that this solution relies on eval down the line somewhere, however I'd still side with using those over plain evaling since I assume that filter_var would also handle sanitizing any input before piping it through eval.


eval() will work perfectly fine for this, but remember you have to tell it to return something.

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

Also make sure you sanitize any user inputs if putting them directly into an eval().


Let's assume eval() is an ok/good solution in your case.

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

prints bool(true)