Tokenizer рдХреЗ рд╕рд╛рде PHP рдореЗрдВ рдХрд╛рдо рдХрд░реЗрдВ

рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП:
рдЯреЛрдХрдирд░рд╛рдЗрдЬрд╝рд░ (рд▓реЗрдХреНрд╕рд░) рдХреЛрдб рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЖрдк рднрд╛рд╖рд╛ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд┐рдП рдмрд┐рдирд╛ рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ рдХреЛ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред
Tokenizer, рд╕рдВрд╕реНрдХрд░рдг php> = 4.3 рд╕реЗ рд╢реБрд░реВ рд╣реЛрдХрд░, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ php рдЕрд╕реЗрдВрдмрд▓реА рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИред

рдЯреЛрдХреЗрдирд┐рдЬрд╝рд░ рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд╛рд░реНрдп рд╣рд▓ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ?
рд╣рд╛рдВ, рдХреЛрдб рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдФрд░ рд╕рдВрд╢реЛрдзрди рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ред

рдХреЛрдб рд╕реЗ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рдирд┐рдХрд╛рд▓рдирд╛


рд╕рдмрд╕реЗ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг php.net рдкрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ - рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП:

<?php function strip_comments($fileName) { $source = file_get_contents($fileName); //     $tokens = token_get_all($source); $result = ''; foreach ($tokens as $token) { if (!is_array($token)) { //  1-  $result .= $token; } else { // - list($id, $value) = $token; switch ($id) { case T_COMMENT: case T_DOC_COMMENT: //   break; default: //   ->  " " $result .= $value; break; } } } return $result; } ?> 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдХреЛрдб рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдореЗрдВ рдЯреЛрдХрди рдХреА рдПрдХ рд╕рд░рдгреА рдорд┐рд▓рддреА рд╣реИ рдФрд░, рдЙрдирдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдЫреЛрдбрд╝реЗрдВ рдпрд╛ рдЫреЛрдбрд╝реЗрдВред
рддреЛ рдЖрдк рд╕рдорд╕реНрдпрд╛рдУрдВ рдФрд░ рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рд╣рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рдПрдХ рдирдХреНрд╢рд╛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП php-files рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред

рдПрдХ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдХрдХреНрд╖рд╛рдУрдВ рдХреА рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛


рдХрд┐рд╕реА рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдХрдХреНрд╖рд╛рдУрдВ рдХреА рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрд╛ рд╣реИ:

 <?php function getClasses($fileName) { $result = array(); $content = file_get_contents($fileName); $tokens = token_get_all($content); $waitingClassName = false; $waitingNamespace = false; $waitingNamespaceSeparator = false; $namespace = array(); for ($i = 0, $c = count($tokens); $i < $c; $i++) { if (is_array($tokens[$i])) { list($id, $value) = $tokens[$i]; switch ($id) { case T_NAMESPACE: $waitingNamespace = true; $waitingNamespaceSeparator = false; $namespace = array(); break; case T_CLASS: case T_INTERFACE: $waitingClassName = true; break; case T_STRING: if ($waitingNamespace) { $namespace[] = $value; $waitingNamespace = false; $waitingNamespaceSeparator = true; } elseif ($waitingClassName) { if (!empty($namespace)) { $value = sprintf('%s\\%s', implode('\\', $namespace), $value); } $result[] = $value; $waitingClassName = false; } break; case T_NS_SEPARATOR: if ($waitingNamespaceSeparator && !$waitingNamespace && !empty($namespace)) { $waitingNamespace = true; $waitingNamespaceSeparator = false; } break; } } else { if (($waitingNamespace || $waitingNamespaceSeparator) && ($tokens[$i] == '{' || $tokens[$i] == ';')) { $waitingNamespace = false; $waitingNamespaceSeparator = false; } } } return $result; } ?> 


рдФрд░ рдлрд┐рд░ рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдФрд░ рдПрдХ рдЫреЛрдЯреА рд╕реА рдЙрдкрдпреЛрдЧрд┐рддрд╛ рд▓рд┐рдЦреА рдЬреЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рдСрдЯреЛрд▓реИрдбрд░ рдмрдирд╛рддрд╛ рд╣реИред
рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдПрдХреНрд╕рдЯреЗрдВрд╢рди * * .php "рдХреЗ рд╕рд╛рде рд╕рднреА рдлрд╛рдЗрд▓реЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдХ рд╡рд░реНрдЧ рдорд╛рдирдЪрд┐рддреНрд░ (рдирд╛рдо рд╕реНрдерд╛рди рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП) рдмрдирд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдСрдЯреЛрд▓реИрдбрд░ рдлрд┐рд░ рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИред
рдЖрдк рдЙрд╕реЗ github.com рдкрд░ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ

рдорд╛рдирдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдирд╛ рдФрд░ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдирд╛


рджреВрд╕рд░реЗ рджрд┐рди рдореБрдЭреЗ рдпрд╛рдж рдЖрдпрд╛ рдХрд┐ рдХреИрд╕реЗ рдореИрдВрдиреЗ рдПрдХ рдмрд╛рд░ рд░рдирдХрд┐рдЯ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рд╕рд╛рде рдЫреЗрдбрд╝рдЫрд╛рдбрд╝ рдХреАред рдЗрд╕рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдореЗрдВ рд╕реЗ, рдореБрдЭреЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдорд╛рдирдХ рдХрд╛рд░реНрдпреЛрдВ рдФрд░ рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдХреЗ рдкреБрдирд░реНрд╡рд┐рддрд░рдг рдореЗрдВ рд░реБрдЪрд┐ рдереА, рдЬрд┐рд╕рдореЗрдВ рдХреБрдЫ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рд░реЛрдХрдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ред
рдФрд░ рдЕрдм рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдХреНрдпрд╛ рдЗрд╕ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рдЗрд╕ рддрд░рд╣ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдЯреЛрдХрдирдзрд╛рд░рдХ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдЗрд╕рд▓рд┐рдП рд░рдирдЯрд╛рдЗрдо рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЬрдиреНрдо рд╣реБрдЖ, рдЬрд┐рд╕рдХреА рдорджрдж рд╕реЗ, рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди, рдЖрдк рдХрд┐рд╕реА рднреА рдорд╛рдирдХ рдХрд╛рд░реНрдп рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдЙрдиреНрд╣реЗрдВ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдореИрдВ рдХрд╛рдо рдХрд╛ рдЙрджрд╛рд╣рд░рдг рджреВрдВрдЧрд╛:

 <?php use Dm\Runtime; $code = <<<CODE <?php echo str_replace( 0, 1, 100 ); ?> CODE; //  Exception,    ,   str_replace  Runtime::code($code) ->disableFunction('str_replace') ->execute(); ?> 


 <?php use Dm\Runtime; $code = <<<CODE <?php echo str_replace( 0, 1, 100 ); ?> CODE; //  000,  111 Runtime::code($code) ->overrideFunction('str_replace', function ($search, $replace, $subject) { //  1  2   echo str_replace($replace, $search, $subject); }) ->execute(); ?> 


рдЗрди рдЕрд╡рд╕рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░рдирд╛ рдПрдХ рдирд┐рдЬреА рдорд╛рдорд▓рд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдЗрд╕реЗ рд╕рд╛рд╡рдзрд╛рдиреА рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдореИрдВрдиреЗ рдереЛрдбрд╝рд╛ рд╢реЛрдз рдХрд┐рдпрд╛ рдФрд░ рдкрд░рд┐рдгрд╛рдо рд╕реЗ рдкреНрд░рд╕рдиреНрди рдерд╛ред
рд░рдирдЯрд╛рдЗрдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдпрд╣ рдХрд╣рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХрд╣рд╛рдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдХрд╣рд╛рдВ рдирд╣реАрдВред рд▓реЗрдХрд┐рди рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЦреБрдж рд╣реА рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЯреЛрдХрдирдзрд╛рд░рдХ рдХреЗ рдХрд╛рд░реНрдп рдФрд░ рдЙрд╕рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред

рд╕рдВрджрд░реНрдн

  1. Tokenizer
  2. Runkit
  3. рдСрдЯреЛрд▓реИрдбрд░ рдЬреЗрдирд░реЗрд╢рди github.com рдкрд░
  4. Github.com рдкрд░ рд░рдирдЯрд╛рдЗрдо рд▓рд╛рдЗрдмреНрд░реЗрд░реА

Source: https://habr.com/ru/post/In176725/


All Articles