Guest User

Untitled

a guest
Jun 18th, 2018
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.72 KB | None | 0 0
  1. <?php
  2. /*---------------------------------------------------------------------------*/
  3.  
  4. define('FILTER_SEP_AND', '+');
  5. define('FILTER_SEP_OR', ',');
  6. define('FILTER_ESCAPE', '\\');
  7.  
  8. function parse_filter($source) {
  9. $filter = array(array('')); $escape = false;
  10. $length = strlen($source); $index = 0;
  11. $group = 0; $sub_group = 0;
  12.  
  13. while ($index++ < $length) {
  14. $char = $source[$index - 1];
  15.  
  16. // Toggle escape status:
  17. if ($char == FILTER_ESCAPE) {
  18. $escape = !$escape;
  19.  
  20. if ($escape) continue;
  21.  
  22. // Handle unescaped:
  23. } else if (!$escape) {
  24. if ($char == FILTER_SEP_AND) {
  25. $filter[] = array('');
  26. $group++; $sub_group = 0;
  27. continue;
  28.  
  29. } else if ($char == FILTER_SEP_OR) {
  30. $filter[$group][] = '';
  31. $sub_group++;
  32. continue;
  33. }
  34.  
  35. } else {
  36. $escape = false;
  37. }
  38.  
  39. $filter[$group][$sub_group] .= $char;
  40. }
  41.  
  42. return $filter;
  43. }
  44.  
  45. function build_query($filter) {
  46. $query = "(";
  47.  
  48. foreach ($filter as $index => $group) {
  49. if ($index) $query .= "\n)\nAND (";
  50.  
  51. foreach ($group as $sub_index => $sub_group) {
  52. $query .= "\n\t";
  53.  
  54. if ($sub_index) $query .= "OR ";
  55.  
  56. $query .= "value = " . trim($sub_group);
  57. }
  58. }
  59.  
  60. $query .= "\n)";
  61.  
  62. return $query;
  63. }
  64.  
  65. /*---------------------------------------------------------------------------*/
  66.  
  67. header('content-type: text/plain');
  68.  
  69. $source = 'one, two \\+ three, four + five, six\\, \\"seven\\" \\\\+ eight';
  70. $filter = parse_filter($source);
  71. $query = build_query($filter);
  72.  
  73. echo "Turn this: {$source}\n\nInto this:\n";
  74. echo $query;
  75.  
  76. /*---------------------------------------------------------------------------*/
  77. ?>
Add Comment
Please, Sign In to add comment