pastebin

Paste Search Dynamic
Recent pastes
Lexer
  1. <?php
  2. class Lexer {
  3.     protected $regex;
  4.     protected $offsetToToken;
  5.  
  6.     public function __construct(array $tokenMap) {
  7.         $this->regex = '((' . implode(')|(', array_keys($tokenMap)) . '))A';
  8.         $this->offsetToToken = array_values($tokenMap);
  9.     }
  10.  
  11.     public function lex($string) {
  12.         $tokens = array();
  13.  
  14.         $offset = 0;
  15.         while (isset($string[$offset])) {
  16.             if (!preg_match($this->regex, $string, $matches, null, $offset)) {
  17.                 throw new Exception(sprintf('Unexpected character "%s"', $string[$offset]));
  18.             }
  19.  
  20.             // find the first non-empty element (but skipping $matches[0]) using a quick for loop
  21.             for ($i = 1; '' === $matches[$i]; ++$i);
  22.             $tokens[] = array($matches[0], $this->offsetToToken[$i - 1]);
  23.             $offset += strlen($matches[0]);
  24.         }
  25.  
  26.         return $tokens;
  27.     }
  28.  
  29.     // a recursive function to actually build the structure
  30.     function generate($arr=array(), $i=0) {
  31.         $output = array();
  32.         $current = null;
  33.         for($i;$i<count($arr);$i++) {
  34.                 list($element, $type) = $arr[$i];
  35.                 if ($type == 'T_OPEN') {
  36.                                 $ret = $this->generate($arr, $i+1);
  37.                         $output[$current] = $ret[0];
  38.                         $i = $ret[1];
  39.                         }
  40.                 elseif ($type == 'T_CLOSE')
  41.                         return [$output, $i];
  42.                 elseif ($type == 'T_FIELD') {
  43.                         $output[$element] = null;
  44.                         $current = $element;
  45.                 }
  46.         }
  47.         return $output;
  48.     }
  49.  
  50. }
  51.  
  52. // here begins the magic
  53.  
  54. // this is our $tokenMap
  55. $tokenMap = array(
  56.     '[^,()]+'           => 'T_FIELD',
  57.     ','                         => 'T_SEPARATOR',
  58.     '('                 => 'T_OPEN',
  59.     ')'                 => 'T_CLOSE'
  60. );
  61.  
  62. // this is your string
  63. $string = "id,topic,member(name,email,group(id,name), asda),message(id,title,body)";
  64.  
  65. $lex = new Lexer($tokenMap);
  66. $structure = $lex->lex($string);
  67. print_r($structure);
  68. $output = $lex->generate($structure);
  69. print_r($output);
Parsed in 0.079 seconds