
рдПрдХ рдмрд╛рд░, рдЬрдм рдЖрдХрд╛рд╢ рдиреАрд▓рд╛ рдерд╛, рдШрд╛рд╕ рд╣рд░рд┐рдпрд╛рд▓реА рдереА рдФрд░ рдбрд╛рдпрдирд╛рд╕реЛрд░ рдкреГрдереНрд╡реА рдкрд░ рдШреВрдорддреЗ рдереЗ ... рдирд╣реАрдВ, рдбрд╛рдпрдирд╛рд╕реЛрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреВрд▓ рдЬрд╛рдУред рдЦреИрд░, рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдПрдХ рдмрд╛рд░ рдорд╛рдирдХ рд╡реЗрдм-рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╕реЗ рдзреНрдпрд╛рди рд╣рдЯрд╛рдиреЗ рдФрд░ рдХреБрдЫ рдЕрдзрд┐рдХ рдкрд╛рдЧрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдЪрд╛рд░ рдЖрдпрд╛ред рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдХреБрдЫ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкрд╕рдВрдж рдЕрдкрдиреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рд▓рд┐рдЦрдиреЗ рд╡рд╛рд▓реЗ рдкрд░ рдЧрд┐рд░ рдЧрдИред рдореИрдВ рдХреНрдпрд╛ рдХрд╣ рд╕рдХрддрд╛ рд╣реВрдВ ...
рдХрднреА рднреА рдЕрдкрдиреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд▓реИрдВрдЧреНрд╡реЗрдЬ рди рд▓рд┐рдЦреЗрдВ ред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЗрд╕ рд╕рдм рд╕реЗ рдХреБрдЫ рдЕрдиреБрднрд╡ рд╣реБрдЖ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕реЗ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдЪрд▓реЛ рдмрд╣реБрдд рдиреАрдВрд╡ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ - рд▓реЗрд╕рд░ред
рдкреНрд░рд╕реНрддрд╛рд╡рдирд╛
рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдЖрдк рд╕рдордЭрдиреЗ рд▓рдЧреЗрдВ рдХрд┐ "рд▓реЗрдХреНрд╕рд░" рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЬрд╛рдирд╡рд░ рд╣реИ, рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ рдХрд┐ рд╣рд╛рдВрдк рдХрд┐рд╕рд╕реЗ рдмрдирд╛ рд╣реИред
рдЖрдзреБрдирд┐рдХ рджреБрдирд┐рдпрд╛ рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрдХрд▓рдХ / рджреБрднрд╛рд╖рд┐рдпрд╛ / рдЯреНрд░рд╛рдВрд╕рдкрд┐рд▓рд░ / рдХреБрдЫ-рд╡рд╣рд╛рдБ-рдФрд░-рдЬреИрд╕реЗ (рдЪрд▓реЛ, рдореИрдВ рдмрд╕ рдЗрд╕реЗ рдЖрдЧреЗ "рд╕рдВрдХрд▓рдХ" рдХрд╣реВрдБрдЧрд╛, рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХреЗ рдмрд┐рдирд╛) рджреЛ рдЯреБрдХрдбрд╝реЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╕реНрдорд╛рд░реНрдЯ рдЪрд╛рдЪрд╛рдУрдВ рдХреА рд╢рдмреНрджрд╛рд╡рд▓реА рдореЗрдВ, рдРрд╕реЗ рдЯреБрдХрдбрд╝реЛрдВ рдХреЛ "рдлреНрд░рдВрдЯреЗрдВрдб" рдФрд░ "рдмреИрдХрдПрдВрдб" рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдирд╣реАрдВ, рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡реЗрдм рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп, рд╣рдореЗрдВ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╕рд╛рдордиреЗ рд╡рд╛рд▓реЗ рдХреЛ HTML рдХреЗ рд╕рд╛рде JS рдореЗрдВ рдирд╣реАрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ ... рдареАрдХ рд╣реИред
рд░рд╛рд╕реНрддреЗ рдореЗрдВ рд╕рд┐рдВрдЯреИрдХреНрд╕ (рдФрд░ рдХрднреА-рдХрднреА рд╢рдмреНрджрд╛рд░реНрде) рдХреА рдЬрд╛рдБрдЪ рдХрд░рддреЗ рд╣реБрдП рдкрд╣рд▓реЗ рд╕реАрдорд╛рдВрдд рдХрд╛ рдХрд╛рд░реНрдп
рдкрд╛рда рдХреЛ рд▓реЗрдирд╛ рдФрд░ рдЗрд╕реЗ
рдПрдПрд╕рдЯреА (рд╕рд╛рд░ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЯреНрд░реА) рдореЗрдВ рдмрджрд▓рдирд╛ рд╣реИред рджреВрд╕рд░рд╛ рдмреИрдХрдПрдВрдб рдХрд╛ рдХрд╛рд░реНрдп рдпрд╣ рд╕рдм рдХрд╛рдо рдХрд░рдирд╛ рд╣реИред рдпрджрд┐ рдХреЛрдб рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреЗ рдЕрдВрджрд░ рдЗрдХрдЯреНрдард╛ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдПрдПрд╕рдЯреА рд╡рд░реНрдЪреБрдЕрд▓ рдкреНрд░реЛрд╕реЗрд╕рд░ (рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди) рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рдмрдирд╛рддрд╛ рд╣реИ, рдпрджрд┐ рдХрдВрдкрд╛рдЗрд▓рд░, рддреЛ рдЕрд╕рд▓реА рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рд╕реЗрдЯред рдЬреАрд╡рди рдореЗрдВ, рд╕рдм рдХреБрдЫ рдХрд╛рдлреА рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИ рдФрд░ рдХрд╛рдлреА рд╣рдж рддрдХ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬреАрд╕реАрд╕реА рд╕рдВрдХрд▓рдХ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рдм рдХреБрдЫ рдорд┐рд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрд▓реИрдВрдЧ рдкрд╣рд▓реЗ рд╕реЗ рдЕрдзрд┐рдХ рд╡рд┐рд╣рд┐рдд рд╣реИ, рдПрд▓рдПрд▓рд╡реАрдПрдо рд╕рдВрдХрд▓рдХ рдХреЗ рд▓рд┐рдП "рдмреИрдХрдПрдВрдб" рдХрд╛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рд╣реИред

рдЕрдм рдЖрдЗрдП рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдлреНрд░рдВрдЯреЗрдВрдб рдирд╛рдордХ рдПрдХ рдЯреБрдХрдбрд╝рд╛ред
рд▓реЗрдХреНрд╕рд┐рдХрд▓ рд╡рд┐рд╢реНрд▓реЗрд╖рдг
рд▓реЗрдХреНрд╕рд░ рдФрд░ рд▓реЗрдХреНрд╕рд┐рдХрд▓ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рдЪрд░рдг рдХрд╛ рдХрд╛рд░реНрдп рдкреНрд░рд╡реЗрд╢ рджреНрд╡рд╛рд░ рдкрд░ рдХрдИ, рдХрдИ рдЕрдХреНрд╖рд░реЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдХреБрдЫ рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдореЗрдВ рд╕рдореВрд╣рд┐рдд рдХрд░рдирд╛ рд╣реИ - "рдЯреЛрдХрди"ред рдЗрд╕рд▓рд┐рдП, рд▓реЗрдХреНрд╕рд┐рдХрд▓ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЛ "рдЯреЛрдХреЗрдирд╛рдЗрдЬреЗрд╢рди" рднреА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдЯреЗрдХреНрд╕реНрдЯ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХрд╛ рдкрд╣рд▓рд╛ рдЪрд░рдг рд╣реИ рдЬреЛ рд╣рд░ рдореМрдЬреВрджрд╛ рдХрдВрдкрд╛рдЗрд▓рд░ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рддрд╛ рд╣реИред
рдХреБрдЫ рдЗрд╕ рддрд░рд╣:
$tokens = ['class', '\w+', '}', '{']; var_dump(lex('class Example {}', $tokens));
рд╡реИрд╕реЗ, рдпрд╣рд╛рдВ рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬреАрд╡рди рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рд▓рд┐рдЦрд╛ рд╣реИред рд╡рд╣реА
рдкреНрд░реАрдЧ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдЬреЛ рд╣рдордиреЗ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдЯреЗрдХреНрд╕реНрдЯ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП
рдереЗ, рдЗрд╕ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА
рд╕рдХреНрд╖рдо рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЙрдкрдХрд░рдг рд╣реИрдВ:
- рдлрд▓реЗрдХреНрд╕ , рдирд┐рдХрд┐рддрд╛ рдкреЛрдкреЛрд╡ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦрд┐рддред
- рд╣реЛрдЖ рдПрдХ рдЯреВрд▓рдХрд┐рдЯ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд▓реЗрдХреНрд╕рд░ + рдкрд╛рд░реНрд╕рд░ + рдЧреНрд░рд╛рдорд░ рд╢рд╛рдорд┐рд▓ рд╣реИред
- рдкреЛрд░реНрдЯ рдпреИрдХ , рдПрдВрдереЛрдиреА рдлреЗрд░рд╛рд░рд╛ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦрд┐рдд, рдЬреЛ рдПрдХ рдЬрдЯрд┐рд▓ рдЯреВрд▓рдХрд┐рдЯ рднреА рд╣реИ, рдФрд░ рдЬрд┐рд╕ рдкрд░ рдкреНрд░рд╕рд┐рджреНрдз рдкреЛрдкреЛрд╡ рдкреАрдПрдЪрдкреА рдкрд╛рд░реНрд╕рд░ рд▓рд┐рдЦрд╛ рд╣реИ, рдЬреЛ рдХреЛрдб рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЯреВрд▓ рдореЗрдВ рд▓рд╛рдЧреВ рд╣реИред
- Railt Lexer PHP 7.1+ рдХреЗ рд▓рд┐рдП рдореЗрд░рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
- рдкрд╛рд░реНрд▓реЗ PHP рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╣реИ рдЬреЛ рдкреАрд╕реАрдЖрд░рдИ рднрд╛рд╡реЛрдВ рдХрд╛ рд╕реАрдорд┐рдд рд╕реЗрдЯ (рдХреЛрдИ рд▓реБрдХ рдирд╣реАрдВ рдФрд░ рдХреБрдЫ рдЕрдиреНрдп рд╕рд┐рдВрдЯреИрдХреНрд╕ рдирд┐рд░реНрдорд╛рдг) рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
- рдФрд░ рдЕрдВрдд рдореЗрдВ, рдорд╛рдирдХ php рдлрд╝рдВрдХреНрд╢рди token_get_all , рдЬреЛ рд╕реАрдзреЗ PHP рдХреЗ рд╢рд╛рдмреНрджрд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП рдЕрднрд┐рдкреНрд░реЗрдд рд╣реИред
рдЦреИрд░, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЧрд┐рдЬрд╝реНрдо рд╣реИрдВ рдЬреЛ рдкрд╛рда рдХреЛ рдЯреЛрдХрди рд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╢рд╛рдпрдж рдореИрдВ рднреА рдХреБрдЫ рднреВрд▓ рдЧрдпрд╛ рд╣реВрдВ, рдЬреИрд╕реЗ рдХрд┐
рдбреЙрдХреНрдЯреНрд░рд┐рди рд▓реЗрдХреНрд╕рд░ред рд▓реЗрдХрд┐рди рдЖрдЧреЗ рдХреНрдпрд╛ рд╣реИ?
рд▓реЗрдХрд░реНрд╕ рдХреЗ рдкреНрд░рдХрд╛рд░
рдФрд░ рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рд╕рдм рдХреБрдЫ рдЙрддрдирд╛ рд╕рд░рд▓ рдирд╣реАрдВ рд╣реИ рдЬрд┐рддрдирд╛ рдпрд╣ рд▓рдЧ рд░рд╣рд╛ рдерд╛ред рд▓реЗрдХрд░реНрд╕ рдХреА рдХрдо рд╕реЗ рдХрдо рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╢реНрд░реЗрдгрд┐рдпрд╛рдВ рд╣реИрдВред рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдХрд▓реНрдк рд╣реИ, рдХрд╛рдлреА рддреБрдЪреНрдЫ, рдЬрд┐рд╕рдореЗрдВ рдЖрдк рдирд┐рдпрдореЛрдВ рдХреЛ рдЦрд┐рд╕рдХрд╛рддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдм рдХреБрдЫ рдЯреЛрдХрди рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрд╛рдж рдХрд╛ рд╡рд┐рдиреНрдпрд╛рд╕ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рджрд┐рдЦрд╛рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдмрд╣реБрдд рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдПрдХ рдФрд░ рд╡рд┐рдХрд▓реНрдк рд╣реИ рдЬрд┐рд╕реЗ
рдорд▓реНрдЯреАрд╕реНрдЯреЗрдЯ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдРрд╕реЗ рд▓реЗрдХрд░реНрд╕ рдХреЛ рд╕рдордЭрдирд╛ рдереЛрдбрд╝рд╛ рдЬреНрдпрд╛рджрд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ, рдЗрд╕рд▓рд┐рдП, рдореИрдВ рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдФрд░ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред
рдорд▓реНрдЯреАрд╕реНрдЯреЗрдЯ рд▓реЗрдХреНрд╕рд░ рдХрд╛ рдХрд╛рд░реНрдп рдкрд┐рдЫрд▓реЗ рд░рд╛рдЬреНрдп рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╡рд┐рднрд┐рдиреНрди рдЯреЛрдХрди рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рд╣реИред рдареАрдХ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, PHP рдореЗрдВ, рдРрд╕реЗ "рд╕рдВрдХреНрд░рдордгрдХрд╛рд▓реАрди" рд░рд╛рдЬреНрдп <? Php +?> рдЯреИрдЧ, рд▓рд╛рдЗрдиреЛрдВ, рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ, рдФрд░
HEREDOC /
NowDOC рдирд┐рд░реНрдорд╛рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ
рдХрд░рдХреЗ рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред
4 рдЯреЛрдХрди рдХреЗ рд╕рд╛рде рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдпрд╛рдж рд░рдЦреЗрдВ? рдЖрдЗрдП рдЗрд╕реЗ рдереЛрдбрд╝рд╛ рд╕рдордЭреЗрдВ рдХрд┐ рдпреЗ рдЕрд╡рд╕реНрдерд╛рдПрдБ рдХреНрдпрд╛ рд╣реИрдВ:
class Example {
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреАрд╕реАрдЖрд░ рдХреА рд╡реНрдпрд╛рдкрдХ рдХреНрд╖рдорддрд╛рдУрдВ рдХреЗ рдмрд┐рдирд╛ рд╕рдмрд╕реЗ рд╕рд░рд▓ рд▓реЗрд╕рд░ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдЯреЛрдХрди рдХреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реЗрдЯ рдорд┐рд▓рддреЗ рд╣реИрдВ:
var_dump(lex(...));
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдореЗрдВ 3-5 рдкрд░ рддрддреНрд╡реЛрдВ рдкрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреНрд░рддрд┐рдмрдВрдз рдЬрдВрдм рдорд┐рд▓рд╛ рд╣реИ: рдЯрд┐рдкреНрдкрдгреА рдХреЛ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд░реВрдк рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдЯреЛрдХрди рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕реЗ рдПрдХ рдкреВрд░реЗ рдЯреБрдХрдбрд╝реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛ред
рдмреЗрд╢рдХ, рдкреАрд╕реАрдЖрд░рдИ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдХреЗ рд╕рд╛рде, рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдЯреЛрдХрди рдХреЛ рдПрдХ рдирд┐рдпрдорд┐рдд рдирд┐рдпрдорд┐рддрддрд╛ рдХреА рдорджрдж рд╕реЗ рдлрд╛рдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ "
// [^ \ n] * \ n ", рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдпрд╣ рдирд╣реАрдВ рд╣реИ? рдпрд╛ рд╣рдо рдЗрд╕реЗ рдЕрдкрдиреЗ рд╣рд╛рдереЛрдВ рд╕реЗ рдЧрд╢ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ? рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдорд▓реНрдЯреАрд╕реНрдЯреЗрдЯ рд▓реЗрдХреНрд╕рд░ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ - рд╣рдо рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╕рднреА рдЯреЛрдХрди рд╕рдореВрд╣
рдирдВрдмрд░ 1 рдореЗрдВ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП, рдЬреИрд╕реЗ рд╣реА "
// " рдЯреЛрдХрди рдкрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕рдореВрд╣
рдирдВрдмрд░ 2 рдореЗрдВ рд╕рдВрдХреНрд░рдордг рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдФрд░ рджреВрд╕рд░реЗ рд╕рдореВрд╣ рдХреЗ рдЕрдВрджрд░, рд░рд┐рд╡рд░реНрд╕ рд╕рдВрдХреНрд░рдордг, рдЕрдЧрд░ рдЯреЛрдХрди "
\ n " рдкрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдкрд╣рд▓реЗ рд╕рдореВрд╣ рдореЗрдВ рд╡рд╛рдкрд╕ рдЪрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИред
рдХреБрдЫ рдЗрд╕ рддрд░рд╣:
$tokens = [ 'group-1' => [ 'class', '\w+', '{', '}', '//' => 'group-2'
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдм рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ HEREDOC рдХреЛ рдХреИрд╕реЗ рдкрд╛рд░реНрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ PCRE рдХреА рд╕рд╛рд░реА рд╢рдХреНрддрд┐ рдХреЗ рд╕рд╛рде рднреА, рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рд▓рд┐рдЦрдирд╛ рдмреЗрд╣рдж рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╣реИ, рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдпрд╣ HEREDOC рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╡реИрд░рд┐рдПрдмрд▓ рдЗрдВрдЯрд░рдкреЛрд▓реЗрд╢рди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдмрд┐рд▓реНрдЯ-рдЗрди
token_get_all рдлрд╝рдВрдХреНрд╢рди (рдиреЛрдЯ> 12 рдЯреЛрдХрди) рдХреЗ рд╕рд╛рде рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ:
<?php $example = 42; $a = <<<EOL Your answer is $example !!! EOL; var_dump(token_get_all(file_get_contents(__FILE__)));
рдЦреИрд░, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЕрднреНрдпрд╛рд╕ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВред
рдЕрднреНрдпрд╛рд╕
рдЖрдЗрдП рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдРрд╕реА рдЪреАрдЬреЛрдВ рдХреЗ рд▓рд┐рдП PHP рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреНрдпрд╛ рд╣реИ? рдЦреИрд░, рдмреЗрд╢рдХ, preg_match! рдареАрдХ рд╣реИ, рдиреАрдЪреЗ рдЖрдУред Preg_match- рдЖрдзрд╛рд░рд┐рдд рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо
рд╣реЛрдЖ рдореЗрдВ рдФрд░
рдлреЗрд▓реНрд╕реА рдХреЗ рдЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ред рдЗрд╕рдХрд╛ рдХрд╛рд░реНрдп рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ:
- рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕реНрд░реЛрдд рдкрд╛рда рдФрд░ рдирд┐рдпрдорд┐рдд рдХреА рдПрдХ рд╕рд░рдгреА рд╣реИред
- рд╣рдо рддрдм рддрдХ рдорд┐рд▓рддреЗ рд╣реИрдВ рдЬрдм рддрдХ рдХрд┐ рдХреБрдЫ рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рдорд┐рд▓ рдЬрд╛рддрд╛ред
- рдЬреИрд╕реЗ рд╣реА рдЖрдк рдПрдХ рдЯреБрдХрдбрд╝рд╛ рдкрд╛рддреЗ рд╣реИрдВ, рдЗрд╕реЗ рдкрд╛рда рд╕реЗ рдмрд╛рд╣рд░ рдХрд╛рдЯреЗрдВ рдФрд░ рдЖрдЧреЗ рдореЗрд▓ рдХрд░реЗрдВред
рдХреЛрдб рд░реВрдк рдореЗрдВ, рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:
рдХреЛрдб рд╢реАрдЯ <?php class SimpleLexer { private $tokens = []; public function __construct(array $tokens) { foreach ($tokens as $name => $definition) { $this->tokens[$name] = \sprintf('/\G%s/isSum', $definition); } } public function lex(string $sources): iterable { [$offset, $length] = [0, \strlen($sources)]; while ($offset < $length) { [$name, $token] = $this->next($sources, $offset); yield $name => $token; $offset += \strlen($token); } } private function next(string $sources, int $offset): array { foreach ($this->tokens as $name => $pcre) { \preg_match($pcre, $sources, $matches, 0, $offset); $token = \reset($matches); if (\count($matches) && \strpos($sources, $token, $offset) === $offset) { return [$name, $token]; } } throw new \RuntimeException('Unrecognized token at offset ' . $offset); } }
рдХреЛрдб рд╢реАрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ $lexer = new SimpleLexer([ 'T_CLASS' => 'class', 'T_CONST' => '\w+', 'T_BRACE_OPEN' => '{', 'T_BRACE_CLOSE' => '}', 'T_WHITESPACE' => '\s+', ]); echo \sprintf('| %-10s | %-20s |', 'VALUE', 'NAME') . "\n"; foreach ($lexer->lex('class Example {}') as $name => $token) { echo \sprintf('| %-10s | %-20s |', '"' . \trim($token, "\n") . '"', $name) . "\n"; }
рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛рдлреА рддреБрдЪреНрдЫ рд╣реИ рдФрд░ рдХреАрдмреЛрд░реНрдб рдХреЗ рдПрдХ рдЬреЛрдбрд╝реЗ рдХреЛ рд▓реЗрдХреНрд╕рд░ рдХреЛ рдЕрдЧрд▓реЗ () рд╡рд┐рдзрд┐ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬреЛ рд░рд╛рдЬреНрдпреЛрдВ рдХреЗ рдмреАрдЪ рдПрдХ рд╕рдВрдХреНрд░рдордг рдХреЛ рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рдмрд╛рдзрд╛ рдХреЛ рдПрдХ рдЖрджрд┐рдо рдмрд╣реБрд╕реНрддрд░реАрдп рд▓реЗрдХреНрд╕рд░ рдореЗрдВ рдмрджрд▓ рджреЗрддрд╛ рд╣реИред
$ рдЗрд╕-> рдЯреЛрдХрди рдХреНрд╖реЗрддреНрд░ рдореЗрдВ, рдмрд╕
$ рдХреБрдЫ
рдЗрд╕ рддрд░рд╣
рдЬреЛрдбрд╝реЗрдВ-> рдЯреЛрдХрди [$ рдпрд╣-> рд░рд╛рдЬреНрдп] ред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдкреНрд░рд╛рдЗрдорд┐рдЯрд┐рд╡рд┐рдЬреНрдо рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рдФрд░ рдЦрд╛рдореА рд╣реИ, рдШрд╛рддрдХ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдмрд╛рд╣рд░ рдирд┐рдХрд▓ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА ... рдЗрд╕ рддрд░рд╣ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рдзреАрдорд╛ рд╣реИред I7 7600k рдкрд░, рдЬрд┐рд╕рдХреЗ рдорд╛рд▓рд┐рдХ рдореИрдВ рд╕рдВрдпреЛрдЧ рд╕реЗ рд╣реБрдЖ рдерд╛ - рдПрдХ рд╕рдорд╛рди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд▓рдЧрднрдЧ 400 рдЯреЛрдХрди рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЙрдирдХреА рд╡рд┐рд╡рд┐рдзрддрд╛рдУрдВ рдореЗрдВ рд╡реГрджреНрдзрд┐ рдХреЗ рд╕рд╛рде (рдпрд╛рдиреА, рдкрд░рд┐рднрд╛рд╖рд╛рдПрдБ рдЬреЛ рд╣рдо рдирд┐рд░реНрдорд╛рддрд╛ рдХреЗ рдкрд╛рд╕ рдЧрдП рдереЗ) - рдпрд╣ рд░реВрд╕ рдореЗрдВ рдмрджрд▓рддреЗ рд░рд╛рд╖реНрдЯреНрд░рдкрддрд┐рдпреЛрдВ рдХреА рдЧрддрд┐ рдХреЛ рдзреАрдорд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ ... рдЕрд╣рдо рдорд╛рдл рдХрд░ рджреАрдЬрд┐рдПред рдореИрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХрд╣рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ рдпрд╣
рдмрд╣реБрдд рдзреАрдореА рдЧрддрд┐ рд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред
рдареАрдХ рд╣реИ, рд╣рдо рдХреНрдпрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП, рдЖрдк рд╕рдордЭ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдЧрд▓рдд рд╣реЛ рд░рд╣рд╛ рд╣реИред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рд╣рд░ рдмрд╛рд░ рдЬрдм рд╣рдо рднрд╛рд╖рд╛ рдХреЗ рд╡рд┐рд▓реНрд╕ рдХреЗ рдЕрдВрджрд░ рдкреНрд░реАрдЧ_рдореИрдЪ рдХрд╣рддреЗ рд╣реИрдВ, рддреЛ рдЙрд╕рдХреЗ JIT рдирд╛рдордХ рдПрдХ рдХрдВрдкрд╛рдЗрд▓рд░ PCRE рдЙрдЧрддрд╛ рд╣реИ (рдФрд░ PHP 7.3 рдХреЗ рд╕рд╛рде, PCRE2 рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣реИ)ред рд╣рд░ рдмрд╛рд░ рд╡рд╣ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рдЦреБрдж рдХреЛ рддреИрдпрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрдирдХреЗ рд▓рд┐рдП рдПрдХ рдкрд╛рд░реНрд╕рд░ рдЗрдХрдЯреНрдард╛ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╣рдо рдЯреЛрдХрди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рда рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдереЛрдбрд╝рд╛ рдЕрдЬреАрдм рдФрд░ рддрдирд╛рддрдиреА рд▓рдЧрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рдЯреЛрдХрди рдХреЛ 1 рд╕реЗ рдПрди рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рд╕рдВрдХрд▓рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬрд╣рд╛рдВ рдПрди рдЗрди рдЯреЛрдХрди рдХреА рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реИред рдЗрд╕реА рд╕рдордп, рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ "
\ "
рдЬреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ "
S " рдзреНрд╡рдЬ рдФрд░ рдЕрдиреБрдХреВрд▓рди рднреА рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдЯреЛрдХрди рдХреЗ рд▓рд┐рдП рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИрдВ, рдорджрдж рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред
рдЗрд╕ рд╕реНрдерд┐рддрд┐ рд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рд░рд╛рд╕реНрддрд╛ рд╣реИ - рдЖрдкрдХреЛ рдЗрд╕ рд╕рднреА рдкрд╛рда рдХреЛ рдПрдХ рдкрд╛рд╕ рдореЗрдВ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддреНред рдХреЗрд╡рд▓ рдПрдХ
preg_match рдлрд╝рдВрдХреНрд╢рди рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдХреЗред рдпрд╣ рджреЛ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИ:
- рдпрд╣ рдХреИрд╕реЗ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ N1 рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдЯреЛрдХрди N2 рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ? рдпрд╛рдиреА рдХреИрд╕реЗ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ " \ w + ", рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, T_CONST рд╣реИ ред
- рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЯреЛрдХрди рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХреИрд╕реЗ рдХрд░реЗрдВред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, preg_match рдпрд╛ preg_match_all рдХреЗ рдкрд░рд┐рдгрд╛рдо рдореЗрдВ рд╕рдм рдХреБрдЫ рдорд┐рд╢реНрд░рд┐рдд рд╣реЛрдЧрд╛ред рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЪреМрдереЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдЭрдВрдбреЗ рдХреА рдорджрдж рд╕реЗ, рд╕реНрдерд┐рддрд┐ рдирд╣реАрдВ рдмрджрд▓реЗрдЧреАред
рдпрд╣рд╛рдВ рдЖрдк рдереЛрдбрд╛ рд░реБрдХ рдХрд░ рд╕реЛрдЪ рд╕рдХрддреЗ рд╣реИрдВред рдЦреИрд░ рдпрд╛ рдирд╣реАрдВред
рдкрд╣рд▓реА рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЛ рдкреАрд╕реАрдЖрд░рдИ
рд╕рдореВрд╣реЛрдВ рдХрд╛
рдирд╛рдо рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ , рдЬрд┐рдиреНрд╣реЗрдВ "рдЙрдкрдорд╛рдХреНрд╕" рднреА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдирд┐рдпрдореЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛: "
<! <T_WHITESPACE> \ s + | <T_WORD> \ w + | ...) " рдЖрдк рд╕рднреА рдЯреЛрдХрди рдХреЛ рдЙрдирдХреЗ рдирд╛рдо рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдЪ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдПрдХ рд╕рд╣рдпреЛрдЧреА рд╕рд░рдгреА рдмрдирд╛рдИ рдЬрд╛рдПрдЧреА, рдЬрд┐рд╕рдореЗрдВ "
[TOKEN_NAME => TOKEN_VALUE] " рдЬреЛрдбрд╝реЗ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВрдЧреЗред
рджреВрд╕рд░рд╛ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдЖрдк рдПрдХ рд╕рд╛рдорд░рд┐рдХ рдЪрд╛рд▓ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░
preg_replace_callback рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХреА рдЦрд╝рд╛рд╕рд┐рдпрдд рдпрд╣ рд╣реИ рдХрд┐ рджреВрд╕рд░реЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдЕрдирд╛рдо рдкрд╣рд▓реЗ рд╕реЗ рдЖрдЦрд┐рд░реА рддрдХ рдкреНрд░рддреНрдпреЗрдХ рдЯреЛрдХрди рдХреЗ рд▓рд┐рдП рд╕рдЦреНрддреА рд╕реЗ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ред
рдЖрджреЗрд╢ рдореЗрдВ рдХрдореА рдирд╣реАрдВ рд╣реИ - рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
рдХреЛрдб рдХрд╛ рдПрдХ рдФрд░ рдлреНрд▓реИрдк class PregReplaceLexer { private $tokens = []; public function __construct(array $tokens) { foreach ($tokens as $name => $definition) { $this->tokens[] = \sprintf('(?<%s>%s)', $name, $definition); } } public function lex(string $sources): iterable { $result = []; \preg_replace_callback($this->compilePcre(), function (array $matches) use (&$result) { foreach (\array_reverse($matches) as $name => $value) { if (\is_string($name) && $value !== '') { $result[] = [$name, $value]; break; } } }, $sources); foreach ($result as [$name, $value]) { yield $name => $value; } } private function compilePcre(): string { return \sprintf('/\G(?:%s)/isSum', \implode('|', $this->tokens)); } }
рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдкрд┐рдЫрд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реИред рдЗрд╕реА рд╕рдордп, рдХрд╛рдо рдХреА рдЧрддрд┐
400 рд╕реЗ
57,000 рдЯреЛрдХрди рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб рддрдХ рдмрдврд╝ рдЬрд╛рддреА рд╣реИред рдпрд╣ рд╡рд╣ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ
рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛
рдерд╛ , рд╣реЛрдЖ рд╕реНрд░реЛрдд рдХреЛрдб рдХрд╛ рдкреБрдирд░реНрд▓реЗрдЦрдиред рд╡реИрд╕реЗ, рдпрджрд┐ рдЖрдк рдкрд╛рд░реНрд▓реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб
600,000 рдЯреЛрдХрди рддрдХ рдирд┐рдЪреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ рд╕рдордЧреНрд░ рддрд╕реНрд╡реАрд░ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреА рд╣реИ (PHP 7.1 рдореЗрдВ XDebug рдЪрд╛рд▓реВ рд╣реЛрдиреЗ рдХреЗ рд╕рд╛рде, рдЗрд╕рд▓рд┐рдП рд╕рдВрдЦреНрдпрд╛ рдХрдо рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдиреБрдкрд╛рдд рд▓рдЧрднрдЧ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)ред

- рдпреЗрд▓реЛ рдкрд╛рд░рд▓реЗ рдХрд╛ рдореВрд▓ рд╡рд┐рд╕реНрддрд╛рд░ рд╣реИред
- рдмреНрд▓реВ - рдкреВрд░реНрд╡ рдЗрдХрдЯреНрдареЗ рдирд┐рдпрдорд┐рдд рдХреЗ рд╕рд╛рде preg_replace_callback рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиред
- рд▓рд╛рд▓ - рд╕рднреА рд╕рдорд╛рди, рд▓реЗрдХрд┐рди рдХреЙрд▓ рдХреЗ рджреМрд░рд╛рди рдЙрддреНрдкрдиреНрди рдирд┐рдпрдорд┐рддрддрд╛ рдХреЗ рд╕рд╛рде preg_replace_callback рдХреЗ рд▓рд┐рдП ред
- рдЧреНрд░реАрди - preg_match рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиред
рдХреНрдпреЛрдВ?
рдЦреИрд░, рдпрд╣ рд╕рдм, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдЕрджреНрднреБрдд рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдзреАрд░ рд▓реЛрдЧреЛрдВ рдХреЛ рд╕рд╡рд╛рд▓ рдкреВрдЫрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрддреНрд╕реБрдХ рд╣реИрдВ: "рдЗрд╕реЗ рдХрд┐рд╕рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ?" PHP рдХреА рдЕрдореВрд░реНрдд рджреБрдирд┐рдпрд╛ рдореЗрдВ, рдЬрд╣рд╛рдВ "рдЕрдВрдЬреАрд░-рдЕрдВрдЬреАрд░ рдФрд░ рд╕рд╛рдЗрдЯ-рддреИрдпрд╛рд░" рдХрд╛ рд╕рд┐рджреНрдзрд╛рдВрдд рд╣рд╛рд╡реА рд╣реИ - рдРрд╕реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд╣рдо рдИрдорд╛рдирджрд╛рд░ рд╣реЛрдВрдЧреЗред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╣рдо рдПрдХ рдкреВрд░реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо
рд╕рд┐рдореНрдлрдиреА / рдпрд╛рдорд▓ рдпрд╛
рдбреЙрдХреНрдЯреНрд░рд┐рди рдЬреИрд╕реЗ рдХреБрдЦреНрдпрд╛рдд рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдпрд╛рдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕рд┐рдореНрдлрдиреА рдореЗрдВ рдПрдиреЛрдЯреЗрд╢рди PHP рдХреЗ рднреАрддрд░ рдПрдХ рд╣реА рдЙрдк-рднрд╛рд╖рд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд▓реЗрдХреНрд╕рд┐рдХрд▓ рдФрд░ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкреАрдПрдЪрдкреА рдореЗрдВ рд▓рд┐рдЦреЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХреЙрдлрд╝реАрд╕реНрдХреНрд░рд┐рдкреНрдЯ, рд▓реЗрд╕, рдФрд░ рдПрд╕рд╕реАрдПрд╕ / рдПрд╕рдПрдПрд╕ рдЯреНрд░рд╛рдВрд╕рдкреИрд░рд░реНрд╕ рднреА рдереЛрдбрд╝рд╛ рдХрдо рдкреНрд░рд╕рд┐рджреНрдз рд╣реИрдВред рдЦреИрд░, рдпрд╛ рдпрд╛ рдФрд░ рдЗрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░
рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕ ред рдореИрдВ рдХреЛрдб рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЙрдкрдХрд░рдгреЛрдВ рдЬреИрд╕реЗ phpmd рдпрд╛ phpcs рдХрд╛ рднреА рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ред рдФрд░ phpDocumentnor рдпрд╛ рд╕рд╛рдореА рдЬреИрд╕реЗ рдкреНрд░рд▓реЗрдЦрди рдЬрдирд░реЗрдЯрд░ рдмрд╣реБрдд рддреБрдЪреНрдЫ рд╣реИрдВред рдЗрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдПрдХ рдбрд┐рдЧреНрд░реА рдпрд╛ рджреВрд╕рд░реЗ рдореЗрдВ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдЯреЗрдХреНрд╕реНрдЯ / рдХреЛрдб рдХреЗ рдкрд╣рд▓реЗ рдЪрд░рдг рдореЗрдВ рд▓реЗрдХреНрд╕рд┐рдХрд▓ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
рдпрд╣ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреА рдкреВрд░реА рд╕реВрдЪреА рдирд╣реАрдВ рд╣реИ рдФрд░ рд╢рд╛рдпрдж рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдореЗрд░реА рдХрд╣рд╛рдиреА рдЖрдкрдХреЛ рдХреБрдЫ рдирдпрд╛ рдЦреЛрдЬрдиреЗ рдФрд░ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рднрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧреАред
рдЕрдВрддрднрд╛рд╖рдг
рдЖрдЧреЗ рджреЗрдЦрддреЗ рд╣реИрдВ, рдЕрдЧрд░ рдХреЛрдИ рднреА рдкрд░реНрд╕рд░ рдФрд░ рдХрдореНрдкрд╛рдЗрд▓рд░ рдХреЗ рд╡рд┐рд╖рдп рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддрд╛ рд╣реИ, рддреЛ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдХреБрдЫ рджрд┐рд▓рдЪрд╕реНрдк рд░рд┐рдкреЛрд░реНрдЯреЗрдВ рд╣реИрдВ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЬреЗрдЯрдмреНрд░реЗрди рдХреЗ рд▓реЛрдЧреЛрдВ рд╕реЗ:
рдлрд┐рд░ рднреА, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдЖрдВрджреНрд░реЗрдИ рдмреНрд░реЗрд╕рд▓реЗрд╡ (
рдЕрдмреНрд░реЗрд╕рд▓реЗрд╡ ) рдХреЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреНрд░рджрд░реНрд╢рди, рдЬреЛ YouTube рдХреА рд╡рд┐рд╢рд╛рд▓рддрд╛ рдкрд░ рдкрд╛рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ - рдореИрдВ рдЖрдкрдХреЛ рджреЗрдЦрдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВред
рдЦреИрд░, рдХрд▓реНрдкрдирд╛ рдХреЗ рдкреНрд░рд╢рдВрд╕рдХреЛрдВ рдХреЗ рд▓рд┐рдП
рдПрдХ рдРрд╕рд╛ рд╕рдВрд╕рд╛рдзрди рд╣реИ рдЬреЛ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдореЗрд░реЗ рд▓рд┐рдП рдмреЗрд╣рдж рдЙрдкрдпреЛрдЧреА рдерд╛ред
рдкреЛрд╕реНрдЯ рдкреЛрд╕реНрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯрдоред рдпрджрд┐ рдЖрдк рдХрд╣реАрдВ рдЗрд╕ рдорд╣рд╛рдХрд╛рд╡реНрдп рдХреА рд╡рд┐рд╢рд╛рд▓рддрд╛ рдореЗрдВ рд╕реАрд▓ рд╣реИрдВ, рддреЛ рдЖрдк рд▓реЗрдЦрдХ рдХреЛ рдХрд┐рд╕реА рднреА рд░реВрдк рдореЗрдВ рдЖрдкрдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд░реВрдк рд╕реЗ рд╕реВрдЪрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдПрдХ рдмреЛрдирд╕ рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВ
рдПрдХ рд╕рд╛рдзрд╛рд░рдг PHP lexer рдХрд╛ рдЙрджрд╛рд╣рд░рдг рджреЗрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдм рдЗрддрдирд╛ рдбрд░рд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЕрдм рдпрд╣ рднреА рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ, рд╣реИ рдирд╛? рдпрджреНрдпрдкрд┐ рдореИрдВ рдЬрд┐рд╕реЗ рдзреЛрдЦрд╛ рджреЗ рд░рд╣рд╛ рд╣реВрдВ, рд╡рд╣ рдЖрдВрдЦреЛрдВ рдХреЛ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рдЦреВрди рдмрд╣ рд░рд╣рд╛ рд╣реИред =)
рдзрдиреНрдпрд╡рд╛рдж!