Merge "Remove Revision::getRevisionText from ApiQueryDeletedrevs"
[lhc/web/wiklou.git] / includes / libs / StringUtils.php
index d91ac85..19dd8fe 100644 (file)
@@ -1,4 +1,7 @@
 <?php
+
+use Wikimedia\AtEase\AtEase;
+
 /**
  * Methods to play with strings.
  *
@@ -243,10 +246,13 @@ class StringUtils {
         * @return string The string with the matches replaced
         */
        static function delimiterReplace( $startDelim, $endDelim, $replace, $subject, $flags = '' ) {
-               $replacer = new RegexlikeReplacer( $replace );
-
-               return self::delimiterReplaceCallback( $startDelim, $endDelim,
-                       $replacer->cb(), $subject, $flags );
+               return self::delimiterReplaceCallback(
+                       $startDelim, $endDelim,
+                       function ( array $matches ) use ( $replace ) {
+                               return strtr( $replace, [ '$0' => $matches[0], '$1' => $matches[1] ] );
+                       },
+                       $subject, $flags
+               );
        }
 
        /**
@@ -263,8 +269,13 @@ class StringUtils {
                $text = str_replace( $placeholder, '', $text );
 
                // Replace instances of the separator inside HTML-like tags with the placeholder
-               $replacer = new DoubleReplacer( $separator, $placeholder );
-               $cleaned = self::delimiterReplaceCallback( '<', '>', $replacer->cb(), $text );
+               $cleaned = self::delimiterReplaceCallback(
+                       '<', '>',
+                       function ( array $matches ) use ( $separator, $placeholder ) {
+                               return str_replace( $separator, $placeholder, $matches[0] );
+                       },
+                       $text
+               );
 
                // Explode, then put the replaced separators back in
                $items = explode( $separator, $cleaned );
@@ -290,8 +301,13 @@ class StringUtils {
                $text = str_replace( $placeholder, '', $text );
 
                // Replace instances of the separator inside HTML-like tags with the placeholder
-               $replacer = new DoubleReplacer( $search, $placeholder );
-               $cleaned = self::delimiterReplaceCallback( '<', '>', $replacer->cb(), $text );
+               $cleaned = self::delimiterReplaceCallback(
+                       '<', '>',
+                       function ( array $matches ) use ( $search, $placeholder ) {
+                               return str_replace( $search, $placeholder, $matches[0] );
+                       },
+                       $text
+               );
 
                // Explode, then put the replaced separators back in
                $cleaned = str_replace( $search, $replace, $cleaned );
@@ -327,4 +343,21 @@ class StringUtils {
                        return new ArrayIterator( explode( $separator, $subject ) );
                }
        }
+
+       /**
+        * Utility function to check if the given string is a valid regex. Avoids
+        * manually calling suppressWarnings and restoreWarnings, and provides a
+        * one-line solution without the need to use @.
+        *
+        * @since 1.34
+        * @param string $string The string you want to check being a valid regex
+        * @return bool
+        */
+       public static function isValidRegex( $string ) {
+               AtEase::suppressWarnings();
+               // @phan-suppress-next-line PhanParamSuspiciousOrder False positive
+               $isValid = preg_match( $string, '' );
+               AtEase::restoreWarnings();
+               return $isValid !== false;
+       }
 }