From 71fab5576a9088a8c33089cf17844e4c49fbada2 Mon Sep 17 00:00:00 2001 From: westi Date: Wed, 10 Nov 2010 19:23:57 +0000 Subject: [PATCH] Improved RegEx for quote matching in wptexturize. Fixes #4539 and #15241 props norbertm. git-svn-id: http://svn.automattic.com/wordpress/trunk@16280 1a063a9b-81f0-0310-95a4-ce76da25c4cd --- wp-includes/formatting.php | 34 +++++++++++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/wp-includes/formatting.php b/wp-includes/formatting.php index db0b1c138..d15d744c1 100644 --- a/wp-includes/formatting.php +++ b/wp-includes/formatting.php @@ -56,9 +56,25 @@ function wptexturize($text) { $static_characters = array_merge(array('---', ' -- ', '--', ' - ', 'xn–', '...', '``', '\'\'', ' (tm)'), $cockney); $static_replacements = array_merge(array('—', ' — ', '–', ' – ', 'xn--', '…', $opening_quote, $closing_quote, ' ™'), $cockneyreplace); - $dynamic_characters = array('/\'(\d\d(?:’|\')?s)/', '/\'(\d)/', '/(\s|\A|[([{<]|")\'/', '/(\d)"/', '/(\d)\'/', '/(\S)\'([^\'\s])/', '/(\s|\A|[([{<])"(?!\s)/', '/"(\s|\S|\Z)/', '/\'([\s.]|\Z)/', '/\b(\d+)x(\d+)\b/'); - $dynamic_replacements = array('’$1','’$1', '$1‘', '$1″', '$1′', '$1’$2', '$1' . $opening_quote . '$2', $closing_quote . '$1', '’$1', '$1×$2'); - + $dynamic_map = array( + '/\'(\d)/' => '’$1', // '99 + + '/\'([^\']*)\'([^\']*)\'/' => '‘$1’$2’', // 'test's' + + '/\'([^\']*)\'/' => '‘$1’', // 'asd' + '/"([^"]*)"/' => $opening_quote . '$1' . $closing_quote, // "qwe" + + '/(\w)\'(\w)/' => '$1’$2', // test's + + '/(\d)"/' => '$1″', // 9" -> 9″ + '/(\d)\'/' => '$1′', // 9' -> 9′ + + '/\b(\d+)x(\d+)\b/' => '$1×$2' // 10. 97x34 => 97×34 + ); + + $dynamic_characters = array_keys($dynamic_map); + $dynamic_replacements = array_values($dynamic_map); + $static_setup = true; } @@ -69,6 +85,9 @@ function wptexturize($text) { $no_texturize_tags_stack = array(); $no_texturize_shortcodes_stack = array(); + + $single_quote_state = '‘'; + $double_quote_state = $opening_quote; for ( $i = 0; $i < $stop; $i++ ) { $curl = $textarr[$i]; @@ -80,6 +99,15 @@ function wptexturize($text) { $curl = str_replace($static_characters, $static_replacements, $curl); // regular expressions $curl = preg_replace($dynamic_characters, $dynamic_replacements, $curl); + // quotes that span multiple tags & shortcodes + while (($pos = strpos($curl, '\'')) !== FALSE) { + $curl = preg_replace('/\'/', $single_quote_state, $curl); + $single_quote_state = (($single_quote_state == '‘') ? '’' : '‘'); + } + while (($pos = strpos($curl, '"')) !== FALSE) { + $curl = preg_replace('/"/', $double_quote_state, $curl); + $double_quote_state = (($double_quote_state == $opening_quote) ? $closing_quote : $opening_quote); + } } elseif (!empty($curl)) { /* * Only call _wptexturize_pushpop_element if first char is correct