@@ -756,6 +756,7 @@ public function parseNumber() |
756 | 756 | // |
757 | 757 | // Valid final states are: 2, 3, 4 and 6. Any parsing that finished in a |
758 | 758 | // state other than these is invalid. |
| 759 | + // Also, negative states are invalid states. |
759 | 760 | $iBak = $this->last; |
760 | 761 | $token = ''; |
761 | 762 | $flags = 0; |
@@ -798,6 +799,10 @@ public function parseNumber() |
798 | 799 | $state = 4; |
799 | 800 | } elseif ($this->str[$this->last] === 'e' || $this->str[$this->last] === 'E') { |
800 | 801 | $state = 5; |
| 802 | + } elseif (($this->str[$this->last] >= 'a' && $this->str[$this->last] <= 'z') |
| 803 | + || ($this->str[$this->last] >= 'A' && $this->str[$this->last] <= 'Z')) { |
| 804 | + // A number can't be directly followed by a letter |
| 805 | + $state = -$state; |
801 | 806 | } elseif ($this->str[$this->last] < '0' || $this->str[$this->last] > '9') { |
802 | 807 | // Just digits and `.`, `e` and `E` are valid characters. |
803 | 808 | break; |
@@ -806,6 +811,10 @@ public function parseNumber() |
806 | 811 | $flags |= Token::FLAG_NUMBER_FLOAT; |
807 | 812 | if ($this->str[$this->last] === 'e' || $this->str[$this->last] === 'E') { |
808 | 813 | $state = 5; |
| 814 | + } elseif (($this->str[$this->last] >= 'a' && $this->str[$this->last] <= 'z') |
| 815 | + || ($this->str[$this->last] >= 'A' && $this->str[$this->last] <= 'Z')) { |
| 816 | + // A number can't be directly followed by a letter |
| 817 | + $state = -$state; |
809 | 818 | } elseif ($this->str[$this->last] < '0' || $this->str[$this->last] > '9') { |
810 | 819 | // Just digits, `e` and `E` are valid characters. |
811 | 820 | break; |
@@ -816,6 +825,10 @@ public function parseNumber() |
816 | 825 | || ($this->str[$this->last] >= '0' && $this->str[$this->last] <= '9') |
817 | 826 | ) { |
818 | 827 | $state = 6; |
| 828 | + } elseif (($this->str[$this->last] >= 'a' && $this->str[$this->last] <= 'z') |
| 829 | + || ($this->str[$this->last] >= 'A' && $this->str[$this->last] <= 'Z')) { |
| 830 | + // A number can't be directly followed by a letter |
| 831 | + $state = -$state; |
819 | 832 | } else { |
820 | 833 | break; |
821 | 834 | } |
|