diff --git a/src/Extension/CoreExtension.php b/src/Extension/CoreExtension.php index 684e98301..6642cff1b 100644 --- a/src/Extension/CoreExtension.php +++ b/src/Extension/CoreExtension.php @@ -944,25 +944,25 @@ function twig_compare($a, $b) { // int <=> string if (\is_int($a) && \is_string($b)) { - $b = trim($b); - if (!is_numeric($b)) { + $bTrim = trim($b, " \t\n\r\v\f"); + if (!is_numeric($bTrim)) { return (string) $a <=> $b; } - if ((int) $b == $b) { - return $a <=> (int) $b; + if ((int) $bTrim == $bTrim) { + return $a <=> (int) $bTrim; } else { - return (float) $a <=> (float) $b; + return (float) $a <=> (float) $bTrim; } } if (\is_string($a) && \is_int($b)) { - $a = trim($a); - if (!is_numeric($a)) { + $aTrim = trim($a, " \t\n\r\v\f"); + if (!is_numeric($aTrim)) { return $a <=> (string) $b; } - if ((int) $a == $a) { - return (int) $a <=> $b; + if ((int) $aTrim == $aTrim) { + return (int) $aTrim <=> $b; } else { - return (float) $a <=> (float) $b; + return (float) $aTrim <=> (float) $b; } } @@ -971,23 +971,23 @@ function twig_compare($a, $b) if (is_nan($a)) { return 1; } - $b = trim($b); - if (!is_numeric($b)) { + $bTrim = trim($b, " \t\n\r\v\f"); + if (!is_numeric($bTrim)) { return (string) $a <=> $b; } - return $a <=> (float) $b; + return $a <=> (float) $bTrim; } if (\is_string($a) && \is_float($b)) { if (is_nan($b)) { return 1; } - $a = trim($a); - if (!is_numeric($a)) { + $aTrim = trim($a, " \t\n\r\v\f"); + if (!is_numeric($aTrim)) { return $a <=> (string) $b; } - return (float) $a <=> $b; + return (float) $aTrim <=> $b; } // fallback to <=> diff --git a/tests/Extension/CoreTest.php b/tests/Extension/CoreTest.php index 91cced5b3..aae0f0f52 100644 --- a/tests/Extension/CoreTest.php +++ b/tests/Extension/CoreTest.php @@ -320,6 +320,10 @@ class CoreTest extends TestCase [-1, 10, 20], [-1, '10', 20], [-1, 10, '20'], + + [1, 42, ' foo'], + [0, 42, "42\f"], + [1, 42, "\x00\x34\x32"], ]; } }