// Standardize newline characters to "\n".
$pee = str_replace(array("\r\n", "\r"), "\n", $pee);
+ // Strip newlines from all elements.
+ $pee = wp_replace_in_html_tags( $pee, array( "\n" => " " ) );
+
// Collapse line breaks before and after <option> elements so they don't get autop'd.
if ( strpos( $pee, '<option' ) !== false ) {
$pee = preg_replace( '|\s*<option|', '<option', $pee );
return $pee;
}
+/**
+ * Replace characters or phrases within HTML elements only.
+ *
+ * @since 4.2.3
+ *
+ * @param string $haystack The text which has to be formatted.
+ * @param array $replace_pairs In the form array('from' => 'to', ...).
+ * @return string The formatted text.
+ */
+function wp_replace_in_html_tags( $haystack, $replace_pairs ) {
+ // Find all elements.
+ $comments =
+ '!' // Start of comment, after the <.
+ . '(?:' // Unroll the loop: Consume everything until --> is found.
+ . '-(?!->)' // Dash not followed by end of comment.
+ . '[^\-]*+' // Consume non-dashes.
+ . ')*+' // Loop possessively.
+ . '(?:-->)?'; // End of comment. If not found, match all input.
+
+ $regex =
+ '/(' // Capture the entire match.
+ . '<' // Find start of element.
+ . '(?(?=!--)' // Is this a comment?
+ . $comments // Find end of comment.
+ . '|'
+ . '[^>]*>?' // Find end of element. If not found, match all input.
+ . ')'
+ . ')/s';
+
+ $textarr = preg_split( $regex, $haystack, -1, PREG_SPLIT_DELIM_CAPTURE );
+ $changed = false;
+
+ // Optimize when searching for one item.
+ if ( 1 === count( $replace_pairs ) ) {
+ // Extract $needle and $replace.
+ foreach ( $replace_pairs as $needle => $replace );
+
+ // Loop through delimeters (elements) only.
+ for ( $i = 1, $c = count( $textarr ); $i < $c; $i += 2 ) {
+ if ( false !== strpos( $textarr[$i], $needle ) ) {
+ $textarr[$i] = str_replace( $needle, $replace, $textarr[$i] );
+ $changed = true;
+ }
+ }
+ } else {
+ // Extract all $needles.
+ $needles = array_keys( $replace_pairs );
+
+ // Loop through delimeters (elements) only.
+ for ( $i = 1, $c = count( $textarr ); $i < $c; $i += 2 ) {
+ foreach ( $needles as $needle ) {
+ if ( false !== strpos( $textarr[$i], $needle ) ) {
+ $textarr[$i] = strtr( $textarr[$i], $replace_pairs );
+ $changed = true;
+ // After one strtr() break out of the foreach loop and look at next element.
+ break;
+ }
+ }
+ }
+ }
+
+ if ( $changed ) {
+ $haystack = implode( $textarr );
+ }
+
+ return $haystack;
+}
+
/**
* Newline preservation help function for wpautop
*
*/
function sanitize_option($option, $value) {
global $wpdb;
+ $error = '';
switch ( $option ) {
case 'admin_email' :
case 'new_admin_email' :
$value = $wpdb->strip_invalid_text_for_column( $wpdb->options, 'option_value', $value );
- $value = sanitize_email( $value );
- if ( ! is_email( $value ) ) {
- $value = get_option( $option ); // Resets option to stored value in the case of failed sanitization
- if ( function_exists( 'add_settings_error' ) )
- add_settings_error( $option, 'invalid_admin_email', __( 'The email address entered did not appear to be a valid email address. Please enter a valid email address.' ) );
+ if ( is_wp_error( $value ) ) {
+ $error = $value->get_error_message();
+ } else {
+ $value = sanitize_email( $value );
+ if ( ! is_email( $value ) ) {
+ $error = __( 'The email address entered did not appear to be a valid email address. Please enter a valid email address.' );
+ }
}
break;
case 'blogdescription':
case 'blogname':
$value = $wpdb->strip_invalid_text_for_column( $wpdb->options, 'option_value', $value );
- $value = wp_kses_post( $value );
- $value = esc_html( $value );
+ if ( is_wp_error( $value ) ) {
+ $error = $value->get_error_message();
+ } else {
+ $value = wp_kses_post( $value );
+ $value = esc_html( $value );
+ }
break;
case 'blog_charset':
case 'mailserver_pass':
case 'upload_path':
$value = $wpdb->strip_invalid_text_for_column( $wpdb->options, 'option_value', $value );
- $value = strip_tags( $value );
- $value = wp_kses_data( $value );
+ if ( is_wp_error( $value ) ) {
+ $error = $value->get_error_message();
+ } else {
+ $value = strip_tags( $value );
+ $value = wp_kses_data( $value );
+ }
break;
case 'ping_sites':
case 'siteurl':
$value = $wpdb->strip_invalid_text_for_column( $wpdb->options, 'option_value', $value );
- if ( (bool)preg_match( '#http(s?)://(.+)#i', $value) ) {
- $value = esc_url_raw($value);
+ if ( is_wp_error( $value ) ) {
+ $error = $value->get_error_message();
} else {
- $value = get_option( $option ); // Resets option to stored value in the case of failed sanitization
- if ( function_exists('add_settings_error') )
- add_settings_error('siteurl', 'invalid_siteurl', __('The WordPress address you entered did not appear to be a valid URL. Please enter a valid URL.'));
+ if ( preg_match( '#http(s?)://(.+)#i', $value ) ) {
+ $value = esc_url_raw( $value );
+ } else {
+ $error = __( 'The WordPress address you entered did not appear to be a valid URL. Please enter a valid URL.' );
+ }
}
break;
case 'home':
$value = $wpdb->strip_invalid_text_for_column( $wpdb->options, 'option_value', $value );
- if ( (bool)preg_match( '#http(s?)://(.+)#i', $value) ) {
- $value = esc_url_raw($value);
+ if ( is_wp_error( $value ) ) {
+ $error = $value->get_error_message();
} else {
- $value = get_option( $option ); // Resets option to stored value in the case of failed sanitization
- if ( function_exists('add_settings_error') )
- add_settings_error('home', 'invalid_home', __('The Site address you entered did not appear to be a valid URL. Please enter a valid URL.'));
+ if ( preg_match( '#http(s?)://(.+)#i', $value ) ) {
+ $value = esc_url_raw( $value );
+ } else {
+ $error = __( 'The Site address you entered did not appear to be a valid URL. Please enter a valid URL.' );
+ }
}
break;
case 'illegal_names':
$value = $wpdb->strip_invalid_text_for_column( $wpdb->options, 'option_value', $value );
- if ( ! is_array( $value ) )
- $value = explode( ' ', $value );
+ if ( is_wp_error( $value ) ) {
+ $error = $value->get_error_message();
+ } else {
+ if ( ! is_array( $value ) )
+ $value = explode( ' ', $value );
- $value = array_values( array_filter( array_map( 'trim', $value ) ) );
+ $value = array_values( array_filter( array_map( 'trim', $value ) ) );
- if ( ! $value )
- $value = '';
+ if ( ! $value )
+ $value = '';
+ }
break;
case 'limited_email_domains':
case 'banned_email_domains':
$value = $wpdb->strip_invalid_text_for_column( $wpdb->options, 'option_value', $value );
- if ( ! is_array( $value ) )
- $value = explode( "\n", $value );
+ if ( is_wp_error( $value ) ) {
+ $error = $value->get_error_message();
+ } else {
+ if ( ! is_array( $value ) )
+ $value = explode( "\n", $value );
- $domains = array_values( array_filter( array_map( 'trim', $value ) ) );
- $value = array();
+ $domains = array_values( array_filter( array_map( 'trim', $value ) ) );
+ $value = array();
- foreach ( $domains as $domain ) {
- if ( ! preg_match( '/(--|\.\.)/', $domain ) && preg_match( '|^([a-zA-Z0-9-\.])+$|', $domain ) )
- $value[] = $domain;
+ foreach ( $domains as $domain ) {
+ if ( ! preg_match( '/(--|\.\.)/', $domain ) && preg_match( '|^([a-zA-Z0-9-\.])+$|', $domain ) ) {
+ $value[] = $domain;
+ }
+ }
+ if ( ! $value )
+ $value = '';
}
- if ( ! $value )
- $value = '';
break;
case 'timezone_string':
$allowed_zones = timezone_identifiers_list();
if ( ! in_array( $value, $allowed_zones ) && ! empty( $value ) ) {
- $value = get_option( $option ); // Resets option to stored value in the case of failed sanitization
- if ( function_exists('add_settings_error') )
- add_settings_error('timezone_string', 'invalid_timezone_string', __('The timezone you have entered is not valid. Please select a valid timezone.') );
+ $error = __( 'The timezone you have entered is not valid. Please select a valid timezone.' );
}
break;
case 'category_base':
case 'tag_base':
$value = $wpdb->strip_invalid_text_for_column( $wpdb->options, 'option_value', $value );
- $value = esc_url_raw( $value );
- $value = str_replace( 'http://', '', $value );
+ if ( is_wp_error( $value ) ) {
+ $error = $value->get_error_message();
+ } else {
+ $value = esc_url_raw( $value );
+ $value = str_replace( 'http://', '', $value );
+ }
break;
case 'default_role' :
case 'moderation_keys':
case 'blacklist_keys':
$value = $wpdb->strip_invalid_text_for_column( $wpdb->options, 'option_value', $value );
- $value = explode( "\n", $value );
- $value = array_filter( array_map( 'trim', $value ) );
- $value = array_unique( $value );
- $value = implode( "\n", $value );
+ if ( is_wp_error( $value ) ) {
+ $error = $value->get_error_message();
+ } else {
+ $value = explode( "\n", $value );
+ $value = array_filter( array_map( 'trim', $value ) );
+ $value = array_unique( $value );
+ $value = implode( "\n", $value );
+ }
break;
}
+ if ( ! empty( $error ) ) {
+ $value = get_option( $option );
+ if ( function_exists( 'add_settings_error' ) ) {
+ add_settings_error( $option, "invalid_{$option}", $error );
+ }
+ }
+
/**
* Filter an option value following sanitization.
*
);
$version = 'ver=' . $wp_version;
+ $develop_src = false !== strpos( $wp_version, '-src' );
- if ( SCRIPT_DEBUG ) {
+ if ( $develop_src || ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ) ) {
$settings['source'] = array(
/** This filter is documented in wp-includes/class.wp-scripts.php */
'wpemoji' => apply_filters( 'script_loader_src', includes_url( "js/wp-emoji.js?$version" ), 'wpemoji' ),