PHP - String Logic Parsing - "X AND Y OR Z" -
i take and/or logic query query string of unknown length:
$logic = 'elephants , tigers or dolphins , apes or monkeys , humans , gorillas , and 133322 or 2';
and parse array, assume like:
$parsed_to_or = array( array('elephants', 'tigers'), array('dolphins', 'apes'), array('monkeys', 'humans', 'gorillas', '133322'), array('2') );
this have far:
$logic_e = preg_split('/\s+/', $logic); $or_segments = array(); $and_group = array(); foreach($logic_e $fragment) { if (preg_match('/^(and|&&)$/i', $fragment)) { continue; } elseif (preg_match('/^(or|\\|\\|)$/i', $fragment)) { if (count($and_group)>0) { $or_segments[] = $and_group; $and_group = array(); } continue; } else { $and_group[] = $fragment; continue; } } if (count($and_group)>0) { $or_segments[] = $and_group; $and_group = array(); }
any better ways tackle this?
update: added ability use && , || anywhere
you can following:
<?php $logic = 'elephants && tigers || dolphins && apes || monkeys , humans , gorillas , && 133322 or 2'; $result = array(); foreach (preg_split('/ (or|\|\|) /', $logic) $parts) { $bits = preg_split('/ (and|&&) /', $parts); ($x=0; $x<count($bits); $x++) { $bits[$x] = preg_replace('/\s?(and|&&)\s?/', '', $bits[$x]); } $result[] = $bits; } echo '<pre>'; var_dump($result);
which result in following:
array(4) { [0]=> array(2) { [0]=> string(9) "elephants" [1]=> string(6) "tigers" } [1]=> array(2) { [0]=> string(8) "dolphins" [1]=> string(4) "apes" } [2]=> array(4) { [0]=> string(7) "monkeys" [1]=> string(6) "humans" [2]=> string(8) "gorillas" [3]=> string(6) "133322" } [3]=> array(1) { [0]=> string(1) "2" } }
Comments
Post a Comment