.
$pee = preg_replace( '|]*)>|i', '', $pee );
$pee = str_replace( '
', '
', $pee );
// If an opening or closing block element tag is preceded by an opening tag, remove it.
$pee = preg_replace( '!
\s*(?' . $allblocks . '[^>]*>)!', '$1', $pee );
// If an opening or closing block element tag is followed by a closing
tag, remove it.
$pee = preg_replace( '!(?' . $allblocks . '[^>]*>)\s*
!', '$1', $pee );
// Optionally insert line breaks.
if ( $br ) {
// Replace newlines that shouldn't be touched with a placeholder.
$pee = preg_replace_callback( '/<(script|style|svg).*?<\/\\1>/s', '_autop_newline_preservation_helper', $pee );
// Normalize
$pee = str_replace( array( '
', '
' ), '
', $pee );
// Replace any new line characters that aren't preceded by a
with a
.
$pee = preg_replace( '|(?)\s*\n|', "
\n", $pee );
// Replace newline placeholders with newlines.
$pee = str_replace( '', "\n", $pee );
}
// If a
tag is after an opening or closing block tag, remove it.
$pee = preg_replace( '!(?' . $allblocks . '[^>]*>)\s*
!', '$1', $pee );
// If a
tag is before a subset of opening or closing block tags, remove it.
$pee = preg_replace( '!
(\s*?(?:p|li|div|dl|dd|dt|th|pre|td|ul|ol)[^>]*>)!', '$1', $pee );
$pee = preg_replace( "|\n$|", '', $pee );
// Replace placeholder tags with their original content.
if ( ! empty( $pre_tags ) ) {
$pee = str_replace( array_keys( $pre_tags ), array_values( $pre_tags ), $pee );
}
// Restore newlines in all elements.
if ( false !== strpos( $pee, '' ) ) {
$pee = str_replace( array( ' ', '' ), "\n", $pee );
}
return $pee;
}
function _autop_newline_preservation_helper( $matches ) {
return str_replace( "\n", '', $matches[0] );
}
function wp_replace_in_html_tags( $haystack, $replace_pairs ) {
// Find all elements.
$textarr = wp_html_split( $haystack );
$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 delimiters (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 delimiters (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;
}
function wp_html_split( $input ) {
return preg_split( get_html_split_regex(), $input, -1, PREG_SPLIT_DELIM_CAPTURE );
}
function get_html_split_regex() {
static $regex;
if ( ! isset( $regex ) ) {
// phpcs:disable Squiz.Strings.ConcatenationSpacing.PaddingFound -- don't remove regex indentation
$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.
$cdata =
'!\[CDATA\[' // Start of comment, after the <.
. '[^\]]*+' // Consume non-].
. '(?:' // Unroll the loop: Consume everything until ]]> is found.
. '](?!]>)' // One ] not followed by end of comment.
. '[^\]]*+' // Consume non-].
. ')*+' // Loop possessively.
. '(?:]]>)?'; // End of comment. If not found, match all input.
$escaped =
'(?=' // Is the element escaped?
. '!--'
. '|'
. '!\[CDATA\['
. ')'
. '(?(?=!-)' // If yes, which type?
. $comments
. '|'
. $cdata
. ')';
$regex =
'/(' // Capture the entire match.
. '<' // Find start of element.
. '(?' // Conditional expression follows.
. $escaped // Find end of escaped element.
. '|' // ... else ...
. '[^>]*>?' // Find end of normal element.
. ')'
. ')/';
// phpcs:enable
}
return $regex;
}