Anchor texturize to shortcodes to improve regex efficiency.

For the 3.9 branch; see [30449] for trunk.

props miqrogroove.
see #29557 for segfault issues.

Built from https://develop.svn.wordpress.org/branches/3.9@30452


git-svn-id: http://core.svn.wordpress.org/branches/3.9@30445 1a063a9b-81f0-0310-95a4-ce76da25c4cd
This commit is contained in:
Andrew Nacin 2014-11-20 14:32:15 +00:00
parent ca3e6728d1
commit 940eb60ad7
1 changed files with 11 additions and 2 deletions

View File

@ -152,7 +152,14 @@ function wptexturize($text) {
$no_texturize_tags_stack = array(); $no_texturize_tags_stack = array();
$no_texturize_shortcodes_stack = array(); $no_texturize_shortcodes_stack = array();
$textarr = preg_split('/(<.*>|\[.*\])/Us', $text, -1, PREG_SPLIT_DELIM_CAPTURE); // Look for shortcodes and HTML elements.
$shortcode_regex =
'\[' // Find start of shortcode.
. '[^\[\]<>]++' // Shortcodes do not contain other shortcodes. Possessive critical.
. '\]'; // Find end of shortcode.
$textarr = preg_split("/(<[^>]*>|$shortcode_regex)/s", $text, -1, PREG_SPLIT_DELIM_CAPTURE);
foreach ( $textarr as &$curl ) { foreach ( $textarr as &$curl ) {
if ( empty( $curl ) ) { if ( empty( $curl ) ) {
@ -163,7 +170,7 @@ function wptexturize($text) {
$first = $curl[0]; $first = $curl[0];
if ( '<' === $first ) { if ( '<' === $first ) {
_wptexturize_pushpop_element($curl, $no_texturize_tags_stack, $no_texturize_tags, '<', '>'); _wptexturize_pushpop_element($curl, $no_texturize_tags_stack, $no_texturize_tags, '<', '>');
} elseif ( '[' === $first ) { } elseif ( '[' === $first && 1 === preg_match( '/^' . $shortcode_regex . '$/', $curl ) ) {
_wptexturize_pushpop_element($curl, $no_texturize_shortcodes_stack, $no_texturize_shortcodes, '[', ']'); _wptexturize_pushpop_element($curl, $no_texturize_shortcodes_stack, $no_texturize_shortcodes, '[', ']');
} elseif ( empty($no_texturize_shortcodes_stack) && empty($no_texturize_tags_stack) ) { } elseif ( empty($no_texturize_shortcodes_stack) && empty($no_texturize_tags_stack) ) {
@ -214,6 +221,8 @@ function _wptexturize_pushpop_element($text, &$stack, $disabled_elements, $openi
array_push($stack, $matches[1]); array_push($stack, $matches[1]);
} }
} elseif ( 0 == count( $stack ) ) {
// Stack is empty. Just stop.
} else { } else {
// Closing? Check $text+2 against disabled elements // Closing? Check $text+2 against disabled elements
$c = preg_quote($closing, '/'); $c = preg_quote($closing, '/');