[BUGFIX] Invalid behaviour with GeneralUtility::trimExplode() 78/44178/4
authorXavier Perseguers <xavier@typo3.org>
Tue, 20 Oct 2015 11:05:14 +0000 (13:05 +0200)
committerJigal van Hemert <jigal.van.hemert@typo3.org>
Wed, 21 Oct 2015 08:31:00 +0000 (10:31 +0200)
The subject's parts are wrongly trimmed although a limit is specified.
According to the PHP documentation, the values are trimmed for whitespace
in the end, not at the beginning.

Change-Id: Ifb4547b3349be2d31d5ce75b19db77eb6535d5ec
Resolves: #70864
Releases: master, 6.2
Reviewed-on: https://review.typo3.org/44178
Reviewed-by: Andreas Fernandez <typo3@scripting-base.de>
Tested-by: Andreas Fernandez <typo3@scripting-base.de>
Reviewed-by: Jigal van Hemert <jigal.van.hemert@typo3.org>
Tested-by: Jigal van Hemert <jigal.van.hemert@typo3.org>
typo3/sysext/core/Classes/Utility/GeneralUtility.php
typo3/sysext/core/Tests/Unit/Utility/GeneralUtilityTest.php

index 7fb0cf9..6ca363c 100755 (executable)
@@ -1523,22 +1523,24 @@ class GeneralUtility
     }
 
     /**
-     * Explodes a string and trims all values for whitespace in the ends.
+     * Explodes a string and trims all values for whitespace in the end.
      * If $onlyNonEmptyValues is set, then all blank ('') values are removed.
      *
      * @param string $delim Delimiter string to explode with
      * @param string $string The string to explode
      * @param bool $removeEmptyValues If set, all empty values will be removed in output
-     * @param int $limit If positive, the result will contain a maximum of
+     * @param int $limit If limit is set and positive, the returned array will contain a maximum of limit elements with
+     *                   the last element containing the rest of string. If the limit parameter is negative, all components
+     *                   except the last -limit are returned.
      * @return array Exploded values
      */
     public static function trimExplode($delim, $string, $removeEmptyValues = false, $limit = 0)
     {
-        $result = array_map('trim', explode($delim, $string));
+        $result = explode($delim, $string);
         if ($removeEmptyValues) {
             $temp = array();
             foreach ($result as $value) {
-                if ($value !== '') {
+                if (trim($value) !== '') {
                     $temp[] = $value;
                 }
             }
@@ -1550,6 +1552,7 @@ class GeneralUtility
         } elseif ($limit < 0) {
             $result = array_slice($result, 0, $limit);
         }
+        $result = array_map('trim', $result);
         return $result;
     }
 
index 8b972ee..e9570a3 100644 (file)
@@ -1364,14 +1364,14 @@ class GeneralUtilityTest extends \TYPO3\CMS\Core\Tests\UnitTestCase
                 ' a , b , c , , d,, ,e ',
                 false,
                 3,
-                ['a', 'b', 'c,,d,,,e']
+                ['a', 'b', 'c , , d,, ,e']
             ],
-            'keeps remaining Results without empty items after reaching limit with positive parameter' => [
+            'keeps remaining results without empty items after reaching limit with positive parameter' => [
                 ',',
                 ' a , b , c , , d,, ,e ',
                 true,
                 3,
-                ['a', 'b', 'c,d,e']
+                ['a', 'b', 'c , d,e']
             ],
             'keeps remaining results with empty items after reaching limit with negative parameter' => [
                 ',',
@@ -1448,21 +1448,21 @@ class GeneralUtilityTest extends \TYPO3\CMS\Core\Tests\UnitTestCase
                 'Hello all   together     all      there all       all   are  all    none',
                 false,
                 5,
-                ['Hello', 'together', 'there', '', 'are all   none']
+                ['Hello', 'together', 'there', '', 'are  all    none']
             ],
             'can use word with appended and prepended spaces as delimiter, do not remove empty, limit and multiple delimiter in last' => [
                 ' all   ',
                 'Hello all   together     all      there all       all   are  all    none',
                 false,
                 4,
-                ['Hello', 'together', 'there', ' all   are all   none']
+                ['Hello', 'together', 'there', 'all   are  all    none']
             ],
             'can use word with appended and prepended spaces as delimiter, remove empty and limit' => [
                 ' all   ',
                 'Hello all   together     all      there all       all   are  all    none',
                 true,
                 4,
-                ['Hello', 'together', 'there', 'are all   none']
+                ['Hello', 'together', 'there', 'are  all    none']
             ],
             'can use word with appended and prepended spaces as delimiter, remove empty and limit and multiple delimiter in last' => [
                 ' all   ',
@@ -1483,14 +1483,14 @@ class GeneralUtilityTest extends \TYPO3\CMS\Core\Tests\UnitTestCase
                 'Helloall  theretogether  all  there    all  there    are   all  there     none',
                 false,
                 4,
-                ['Hello', 'together', '', 'areall  therenone']
+                ['Hello', 'together', '', 'are   all  there     none']
             ],
             'can use words as delimiter, do not remove empty, limit and multiple delimiter in last' => [
                 'all  there',
                 'Helloall  theretogether  all  there    all  there    are   all  there     none',
                 false,
                 3,
-                ['Hello', 'together', 'all  thereareall  therenone']
+                ['Hello', 'together', 'all  there    are   all  there     none']
             ],
             'can use words as delimiter, remove empty' => [
                 'all  there',
@@ -1504,7 +1504,7 @@ class GeneralUtilityTest extends \TYPO3\CMS\Core\Tests\UnitTestCase
                 'Helloall  theretogether  all  there    all  there    are   all  there     none',
                 true,
                 3,
-                ['Hello', 'together', 'areall  therenone']
+                ['Hello', 'together', 'are   all  there     none']
             ],
             'can use words as delimiter, remove empty and limit and multiple delimiter in last' => [
                 'all  there',
@@ -1532,7 +1532,7 @@ class GeneralUtilityTest extends \TYPO3\CMS\Core\Tests\UnitTestCase
                 " a  b \t c  \t  \t    d  \t  e     \t u j   \t s",
                 false,
                 4,
-                ['a  b', 'c', '', "d\te\tu j\ts"]
+                ['a  b', 'c', '', "d  \t  e     \t u j   \t s"]
             ],
             'works with whitespace separator and remove empty' => [
                 "\t",
@@ -1546,7 +1546,7 @@ class GeneralUtilityTest extends \TYPO3\CMS\Core\Tests\UnitTestCase
                 " a  b \t c  \t  \t    d  \t  e     \t u j   \t s",
                 true,
                 3,
-                ['a  b', 'c', "d\te\tu j\ts"]
+                ['a  b', 'c', "d  \t  e     \t u j   \t s"]
             ],
         ];
     }