fork download
  1. <?php
  2.  
  3. // Como achar uma string baseando-se em um grupo de expressões regulares
  4. // https://pt.stackoverflow.com/q/207089/53463
  5.  
  6. function analisar( $string ) {
  7. $regex = '/
  8. (?P<var> {{\s*\$(.*?)\s*}} )
  9. |
  10. (?P<loop> @for\((.*?)\)\s*{{((?:[^{}]|(?R))*)}} )
  11. |
  12. (?P<statement> @if\((.*?)\)\s*{{((?:[^{}]|(?R))*)}} )
  13. /x';
  14.  
  15. $resultado = preg_replace_callback(
  16. $regex,
  17. function ($matches) {
  18. /*
  19. //debug
  20. echo "\n\nSubst: $matches[0]\n\$matches = ";
  21. var_export($matches);
  22. */
  23. if ($matches['var']) {
  24. return getVar($matches[2]);
  25.  
  26. } else if ($matches['loop']) {
  27. return loop($matches[4], $matches[5]);
  28.  
  29. } else if ($matches['statement']) {
  30. return getStatementResult($matches[7], $matches[8]);
  31. }
  32. },
  33. $string
  34. );
  35.  
  36. return $resultado;
  37. }
  38.  
  39. function getVar($nomeDaVariavel){
  40. return 'VAR('
  41. . analisar($nomeDaVariavel)
  42. . ')';
  43. }
  44. function loop($nomeDoArray, $codigo){
  45. return "LOOP\nLOOP-COND("
  46. . analisar($nomeDoArray)
  47. . ")\nLOOP-CODIGO("
  48. . analisar($codigo)
  49. . ')';
  50. }
  51. function getStatementResult($expressãoBooleana, $codigo){
  52. return "IF\nIF-COND("
  53. . analisar($expressãoBooleana)
  54. . ")\nIF-CODIGO("
  55. . analisar($codigo)
  56. . ')';
  57. }
  58.  
  59.  
  60. // -----
  61. // TESTE
  62. // -----
  63.  
  64. $string = '
  65. <span>{{ $nomeCompleto }}</span>
  66.  
  67. @for($nomes as $nome)
  68. {{
  69. @if($nome == \'Eleandro\')
  70. {{
  71. <p>{{ $nome }}</p>
  72. }}
  73. }}
  74. ';
  75.  
  76. echo analisar($string);
Success #stdin #stdout 0.01s 82944KB
stdin
Standard input is empty
stdout
<span>VAR(nomeCompleto)</span>

LOOP
LOOP-COND($nomes as $nome)
LOOP-CODIGO(
  IF
IF-COND($nome == 'Eleandro')
IF-CODIGO(
    <p>VAR(nome)</p>
  )
)