: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in
* Replaces double line breaks with paragraph elements.
* @param string $input The text which has to be formatted.
* @param bool $br Optional. If set, this will convert all remaining
* line breaks after paragraphing. Default true.
* @return string Text which has been converted into correct paragraph tags.
function wpcf7_autop( $input, $br = true ) {
// Replace non-HTML embedded elements with placeholders.
$input = preg_replace_callback(
'/<(math|svg).*?<\/\1>/is',
static function ( $matches ) use ( &$placeholders ) {
WPCF7_HTMLFormatter::placeholder_inline,
WPCF7_HTMLFormatter::normalize_start_tag( $placeholder );
$placeholders[$placeholder] = $matches[0];
$formatter = new WPCF7_HTMLFormatter( array(
$chunks = $formatter->separate_into_chunks( $input );
$output = $formatter->format( $chunks );
// Restore from placeholders.
array_keys( $placeholders ),
array_values( $placeholders ),
* Newline preservation help function for wpcf7_autop().
* @deprecated 5.7 Unnecessary to use any more.
* @param array $matches preg_replace_callback() matches array.
* @return string Text including newline placeholders.
function wpcf7_autop_preserve_newline_callback( $matches ) {
return str_replace( "\n", '<WPPreserveNewline />', $matches[0] );
* Sanitizes the query variables.
* @param string $text Query variable.
* @return string Text sanitized.
function wpcf7_sanitize_query_var( $text ) {
$text = wp_unslash( $text );
$text = wp_check_invalid_utf8( $text );
if ( false !== strpos( $text, '<' ) ) {
$text = wp_pre_kses_less_than( $text );
$text = wp_strip_all_tags( $text );
$text = preg_replace( '/%[a-f0-9]{2}/i', '', $text );
$text = preg_replace( '/ +/', ' ', $text );
$text = trim( $text, ' ' );
* Strips quote characters surrounding the input.
* @param string $text Input text.
* @return string Processed output.
function wpcf7_strip_quote( $text ) {
if ( preg_match( '/^"(.*)"$/s', $text, $matches ) ) {
} elseif ( preg_match( "/^'(.*)'$/s", $text, $matches ) ) {
* Navigates through an array, object, or scalar, and
* strips quote characters surrounding the each value.
* @param mixed $input The array or string to be processed.
* @return mixed Processed value.
function wpcf7_strip_quote_deep( $input ) {
if ( is_string( $input ) ) {
return wpcf7_strip_quote( $input );
if ( is_array( $input ) ) {
foreach ( $input as $key => $text ) {
$result[$key] = wpcf7_strip_quote_deep( $text );
* Normalizes newline characters.
* @param string $text Input text.
* @param string $to Optional. The newline character that is used in the output.
* @return string Normalized text.
function wpcf7_normalize_newline( $text, $to = "\n" ) {
if ( ! is_string( $text ) ) {
$nls = array( "\r\n", "\r", "\n" );
if ( ! in_array( $to, $nls ) ) {
return str_replace( $nls, $to, $text );
* Navigates through an array, object, or scalar, and
* normalizes newline characters in the each value.
* @param mixed $input The array or string to be processed.
* @param string $to Optional. The newline character that is used in the output.
* @return mixed Processed value.
function wpcf7_normalize_newline_deep( $input, $to = "\n" ) {
if ( is_array( $input ) ) {
foreach ( $input as $key => $text ) {
$result[$key] = wpcf7_normalize_newline_deep( $text, $to );
return wpcf7_normalize_newline( $input, $to );
* Strips newline characters.
* @param string $text Input text.
* @return string Processed one-line text.
function wpcf7_strip_newline( $text ) {
$text = str_replace( array( "\r", "\n" ), '', $text );
* @param string $text Input text.
* @param string|array|object $options Options.
* @return string Canonicalized text.
function wpcf7_canonicalize( $text, $options = '' ) {
if ( is_string( $options ) and '' !== $options
and false === strpos( $options, '=' ) ) {
$options = wp_parse_args( $options, array(
'strip_separators' => false,
if ( ! isset( $charset ) ) {
$charset = get_option( 'blog_charset' );
array( 'utf8', 'utf-8', 'UTF8', 'UTF-8' )
$text = html_entity_decode( $text, ENT_QUOTES | ENT_HTML5, $charset );
if ( function_exists( 'mb_convert_kana' ) ) {
$text = mb_convert_kana( $text, 'asKV', $charset );
if ( $options['strip_separators'] ) {
$text = preg_replace( '/[\r\n\t ]+/', '', $text );
$text = preg_replace( '/[\r\n\t ]+/', ' ', $text );
if ( 'lower' == $options['strto'] ) {
if ( function_exists( 'mb_strtolower' ) ) {
$text = mb_strtolower( $text, $charset );
$text = strtolower( $text );
} elseif ( 'upper' == $options['strto'] ) {
if ( function_exists( 'mb_strtoupper' ) ) {
$text = mb_strtoupper( $text, $charset );
$text = strtoupper( $text );
* Sanitizes Contact Form 7's form unit-tag.
* @param string $tag Unit-tag.
* @return string Sanitized unit-tag.
function wpcf7_sanitize_unit_tag( $tag ) {
$tag = preg_replace( '/[^A-Za-z0-9_-]/', '', (string) $tag );
* Converts a file name to one that is not executable as a script.
* @param string $filename File name.
* @return string Converted file name.
function wpcf7_antiscript_file_name( $filename ) {
$filename = wp_basename( $filename );
// Apply part of protection logic from sanitize_file_name().
'?', '[', ']', '/', '\\', '=', '<', '>', ':', ';', ',', "'", '"',
'&', '$', '#', '*', '(', ')', '|', '~', '`', '!', '{', '}',
'%', '+', '’', '«', '»', '”', '“', chr( 0 )
$filename = preg_replace( '/[\r\n\t -]+/', '-', $filename );
$filename = preg_replace( '/[\pC\pZ]+/iu', '', $filename );
$parts = explode( '.', $filename );
if ( count( $parts ) < 2 ) {
$script_pattern = '/^(php|phtml|pl|py|rb|cgi|asp|aspx)\d?$/i';
$filename = array_shift( $parts );
$extension = array_pop( $parts );
foreach ( (array) $parts as $part ) {
if ( preg_match( $script_pattern, $part ) ) {
$filename .= '.' . $part . '_';
$filename .= '.' . $part;
if ( preg_match( $script_pattern, $extension ) ) {
$filename .= '.' . $extension . '_.txt';
$filename .= '.' . $extension;
* Masks a password with asterisks (*).
* @param int $right Length of right-hand unmasked text. Default 0.
* @param int $left Length of left-hand unmasked text. Default 0.
* @return string Text of masked password.
function wpcf7_mask_password( $text, $right = 0, $left = 0 ) {
$length = strlen( $text );
$right = absint( $right );
if ( $length < $right + $left ) {
$masked = str_repeat( '*', $length - ( $right + $left ) );
} elseif ( $right + $left < 48 ) {
$masked = str_repeat( '*', 48 - ( $right + $left ) );
$left_unmasked = $left ? substr( $text, 0, $left ) : '';
$right_unmasked = $right ? substr( $text, -1 * $right ) : '';
$text = $left_unmasked . $masked . $right_unmasked;
* Returns an array of allowed HTML tags and attributes for a given context.
* @param string $context Context used to decide allowed tags and attributes.
* @return array Array of allowed HTML tags and their allowed attributes.
function wpcf7_kses_allowed_html( $context = 'form' ) {
static $allowed_tags = array();
if ( isset( $allowed_tags[$context] ) ) {
'wpcf7_kses_allowed_html',
$allowed_tags[$context] = wp_kses_allowed_html( 'post' );
if ( 'form' === $context ) {
$additional_tags_for_form = array(
$additional_tags_for_form = array_map(
static function ( $elm ) {
$global_attributes = array(
'aria-describedby' => true,
'aria-labelledby' => true,
return array_merge( $global_attributes, (array) $elm );
$additional_tags_for_form
$allowed_tags[$context] = array_merge(
$additional_tags_for_form
'wpcf7_kses_allowed_html',