Просмотр исходного кода

bug #4107 Preg::split - fix for non-UTF8 subject (ostrolucky, kubawerlos)

This PR was merged into the 2.12 branch.

Discussion
----------

Preg::split - fix for non-UTF8 subject

replaces https://github.com/FriendsOfPHP/PHP-CS-Fixer/pull/4093

Commits
-------

b29848e Fix Preg::split - fix for non-UTF8 subject
9753b8f Failing test case for non-utf8 diff
SpacePossum 6 лет назад
Родитель
Сommit
427f227a6d
3 измененных файлов с 35 добавлено и 13 удалено
  1. 10 10
      src/Preg.php
  2. 21 0
      tests/Differ/DiffConsoleFormatterTest.php
  3. 4 3
      tests/PregTest.php

+ 10 - 10
src/Preg.php

@@ -36,12 +36,12 @@ final class Preg
     public static function match($pattern, $subject, &$matches = null, $flags = 0, $offset = 0)
     public static function match($pattern, $subject, &$matches = null, $flags = 0, $offset = 0)
     {
     {
         $result = @preg_match(self::addUtf8Modifier($pattern), $subject, $matches, $flags, $offset);
         $result = @preg_match(self::addUtf8Modifier($pattern), $subject, $matches, $flags, $offset);
-        if (false !== $result) {
+        if (false !== $result && PREG_NO_ERROR === preg_last_error()) {
             return $result;
             return $result;
         }
         }
 
 
         $result = @preg_match(self::removeUtf8Modifier($pattern), $subject, $matches, $flags, $offset);
         $result = @preg_match(self::removeUtf8Modifier($pattern), $subject, $matches, $flags, $offset);
-        if (false !== $result) {
+        if (false !== $result && PREG_NO_ERROR === preg_last_error()) {
             return $result;
             return $result;
         }
         }
 
 
@@ -62,12 +62,12 @@ final class Preg
     public static function matchAll($pattern, $subject, &$matches = null, $flags = PREG_PATTERN_ORDER, $offset = 0)
     public static function matchAll($pattern, $subject, &$matches = null, $flags = PREG_PATTERN_ORDER, $offset = 0)
     {
     {
         $result = @preg_match_all(self::addUtf8Modifier($pattern), $subject, $matches, $flags, $offset);
         $result = @preg_match_all(self::addUtf8Modifier($pattern), $subject, $matches, $flags, $offset);
-        if (false !== $result) {
+        if (false !== $result && PREG_NO_ERROR === preg_last_error()) {
             return $result;
             return $result;
         }
         }
 
 
         $result = @preg_match_all(self::removeUtf8Modifier($pattern), $subject, $matches, $flags, $offset);
         $result = @preg_match_all(self::removeUtf8Modifier($pattern), $subject, $matches, $flags, $offset);
-        if (false !== $result) {
+        if (false !== $result && PREG_NO_ERROR === preg_last_error()) {
             return $result;
             return $result;
         }
         }
 
 
@@ -88,12 +88,12 @@ final class Preg
     public static function replace($pattern, $replacement, $subject, $limit = -1, &$count = null)
     public static function replace($pattern, $replacement, $subject, $limit = -1, &$count = null)
     {
     {
         $result = @preg_replace(self::addUtf8Modifier($pattern), $replacement, $subject, $limit, $count);
         $result = @preg_replace(self::addUtf8Modifier($pattern), $replacement, $subject, $limit, $count);
-        if (null !== $result) {
+        if (null !== $result && PREG_NO_ERROR === preg_last_error()) {
             return $result;
             return $result;
         }
         }
 
 
         $result = @preg_replace(self::removeUtf8Modifier($pattern), $replacement, $subject, $limit, $count);
         $result = @preg_replace(self::removeUtf8Modifier($pattern), $replacement, $subject, $limit, $count);
-        if (null !== $result) {
+        if (null !== $result && PREG_NO_ERROR === preg_last_error()) {
             return $result;
             return $result;
         }
         }
 
 
@@ -114,12 +114,12 @@ final class Preg
     public static function replaceCallback($pattern, $callback, $subject, $limit = -1, &$count = null)
     public static function replaceCallback($pattern, $callback, $subject, $limit = -1, &$count = null)
     {
     {
         $result = @preg_replace_callback(self::addUtf8Modifier($pattern), $callback, $subject, $limit, $count);
         $result = @preg_replace_callback(self::addUtf8Modifier($pattern), $callback, $subject, $limit, $count);
-        if (null !== $result) {
+        if (null !== $result && PREG_NO_ERROR === preg_last_error()) {
             return $result;
             return $result;
         }
         }
 
 
         $result = @preg_replace_callback(self::removeUtf8Modifier($pattern), $callback, $subject, $limit, $count);
         $result = @preg_replace_callback(self::removeUtf8Modifier($pattern), $callback, $subject, $limit, $count);
-        if (null !== $result) {
+        if (null !== $result && PREG_NO_ERROR === preg_last_error()) {
             return $result;
             return $result;
         }
         }
 
 
@@ -139,12 +139,12 @@ final class Preg
     public static function split($pattern, $subject, $limit = -1, $flags = 0)
     public static function split($pattern, $subject, $limit = -1, $flags = 0)
     {
     {
         $result = @preg_split(self::addUtf8Modifier($pattern), $subject, $limit, $flags);
         $result = @preg_split(self::addUtf8Modifier($pattern), $subject, $limit, $flags);
-        if (false !== $result) {
+        if (false !== $result && PREG_NO_ERROR === preg_last_error()) {
             return $result;
             return $result;
         }
         }
 
 
         $result = @preg_split(self::removeUtf8Modifier($pattern), $subject, $limit, $flags);
         $result = @preg_split(self::removeUtf8Modifier($pattern), $subject, $limit, $flags);
-        if (false !== $result) {
+        if (false !== $result && PREG_NO_ERROR === preg_last_error()) {
             return $result;
             return $result;
         }
         }
 
 

+ 21 - 0
tests/Differ/DiffConsoleFormatterTest.php

@@ -101,6 +101,27 @@ final class DiffConsoleFormatterTest extends TestCase
 ',
 ',
                 '| %s',
                 '| %s',
             ],
             ],
+            [
+                mb_convert_encoding("<fg=red>--- Original</fg=red>\n<fg=green>+ausgefüllt</fg=green>", 'ISO-8859-1'),
+                true,
+                '%s',
+                mb_convert_encoding("--- Original\n+ausgefüllt", 'ISO-8859-1'),
+                '%s',
+            ],
+            [
+                mb_convert_encoding("<fg=red>--- Original</fg=red>\n<fg=green>+++ New</fg=green>\n<fg=cyan>@@ @@</fg=cyan>\n<fg=red>-ausgefüllt</fg=red>", 'ISO-8859-1'),
+                true,
+                '%s',
+                mb_convert_encoding("--- Original\n+++ New\n@@ @@\n-ausgefüllt", 'ISO-8859-1'),
+                '%s',
+            ],
+            [
+                mb_convert_encoding("--- Original\n+++ New\n@@ @@\n-ausgefüllt", 'ISO-8859-1'),
+                false,
+                '%s',
+                mb_convert_encoding("--- Original\n+++ New\n@@ @@\n-ausgefüllt", 'ISO-8859-1'),
+                '%s',
+            ],
         ];
         ];
     }
     }
 }
 }

+ 4 - 3
tests/PregTest.php

@@ -166,13 +166,14 @@ final class PregTest extends TestCase
 
 
     /**
     /**
      * @param string $pattern
      * @param string $pattern
+     * @param string $subject
      *
      *
      * @dataProvider provideCommonCases
      * @dataProvider provideCommonCases
      */
      */
-    public function testSplit($pattern)
+    public function testSplit($pattern, $subject)
     {
     {
-        $expectedResult = preg_split($pattern, 'foo');
-        $actualResult = Preg::split($pattern, 'foo');
+        $expectedResult = preg_split($pattern, $subject);
+        $actualResult = Preg::split($pattern, $subject);
 
 
         $this->assertSame($expectedResult, $actualResult);
         $this->assertSame($expectedResult, $actualResult);
     }
     }