diff --git a/src/wp-includes/formatting.php b/src/wp-includes/formatting.php
index 5af533932f..77ecbcda72 100644
--- a/src/wp-includes/formatting.php
+++ b/src/wp-includes/formatting.php
@@ -198,7 +198,7 @@ function wptexturize($text, $reset = false) {
. '(?(?=!--)' // Is this a comment?
. '.+?--\s*>' // Find end of comment
. '|'
- . '.+?>' // Find end of element
+ . '[^>]+>' // Find end of element
. ')'
. '|'
. '\[' // Find start of shortcode.
@@ -206,7 +206,7 @@ function wptexturize($text, $reset = false) {
. '(?:'
. '[^\[\]<>]' // Shortcodes do not contain other shortcodes.
. '|'
- . '<.+?>' // HTML elements permitted. Prevents matching ] before >.
+ . '<[^>]+>' // HTML elements permitted. Prevents matching ] before >.
. ')+'
. '\]' // Find end of shortcode.
. '\]?' // Shortcodes may end with ]]
@@ -224,12 +224,12 @@ function wptexturize($text, $reset = false) {
_wptexturize_pushpop_element( $curl, $no_texturize_tags_stack, $no_texturize_tags );
}
- } elseif ( '[' === $first && 1 === preg_match( '/^\[(?:[^\[\]<>]|<.+?>)+\]$/', $curl ) ) {
+ } elseif ( '[' === $first && 1 === preg_match( '/^\[(?:[^\[\]<>]|<[^>]+>)+\]$/', $curl ) ) {
// This is a shortcode delimeter.
_wptexturize_pushpop_element( $curl, $no_texturize_shortcodes_stack, $no_texturize_shortcodes );
- } elseif ( '[' === $first && 1 === preg_match( '/^\[\[?(?:[^\[\]<>]|<.+?>)+\]\]?$/', $curl ) ) {
+ } elseif ( '[' === $first && 1 === preg_match( '/^\[\[?(?:[^\[\]<>]|<[^>]+>)+\]\]?$/', $curl ) ) {
// This is an escaped shortcode delimeter.
// Do not texturize.
diff --git a/tests/phpunit/tests/formatting/WPTexturize.php b/tests/phpunit/tests/formatting/WPTexturize.php
index ea22b62500..7ba7346251 100644
--- a/tests/phpunit/tests/formatting/WPTexturize.php
+++ b/tests/phpunit/tests/formatting/WPTexturize.php
@@ -1305,6 +1305,22 @@ class Tests_Formatting_WPTexturize extends WP_UnitTestCase {
'word word', // Ensure we are not corrupting image URLs.
'word word',
),
+ array(
+ '[ do texturize "[quote]" here ]',
+ '[ do texturize “[quote]” here ]',
+ ),
+ array(
+ '[ regex catches this here ]',
+ '[ regex catches this here ]',
+ ),
+ array(
+ '[ but also catches the styled "[quote]" here ]',
+ '[ but also catches the styled “[quote]” here ]',
+ ),
+ array(
+ '[Let\'s get crazy[plugin code="hello"]world]',
+ '[Let’s get crazy[plugin code="hello"]world]',
+ ),
);
}