WordPress Version: 6.2
/**
* Callback for `wp_kses_split()` for fixing malformed HTML tags.
*
* This function does a lot of work. It rejects some very malformed things like
* `<:::>`. It returns an empty string, if the element isn't allowed (look ma, no
* `strip_tags()`!). Otherwise it splits the tag into an element and an attribute
* list.
*
* After the tag is split into an element and an attribute list, it is run
* through another filter which will remove illegal attributes and once that is
* completed, will be returned.
*
* @access private
* @ignore
* @since 1.0.0
*
* @param string $content Content to filter.
* @param array[]|string $allowed_html An array of allowed HTML elements and attributes,
* or a context name such as 'post'. See wp_kses_allowed_html()
* for the list of accepted context names.
* @param string[] $allowed_protocols Array of allowed URL protocols.
* @return string Fixed HTML element
*/
function wp_kses_split2($content, $allowed_html, $allowed_protocols)
{
$content = wp_kses_stripslashes($content);
// It matched a ">" character.
if ('<' !== substr($content, 0, 1)) {
return '>';
}
// Allow HTML comments.
if ('<!--' === substr($content, 0, 4)) {
$content = str_replace(array('<!--', '-->'), '', $content);
while (($newstring = wp_kses($content, $allowed_html, $allowed_protocols)) != $content) {
$content = $newstring;
}
if ('' === $content) {
return '';
}
// Prevent multiple dashes in comments.
$content = preg_replace('/--+/', '-', $content);
// Prevent three dashes closing a comment.
$content = preg_replace('/-$/', '', $content);
return "<!--{$content}-->";
}
// It's seriously malformed.
if (!preg_match('%^<\s*(/\s*)?([a-zA-Z0-9-]+)([^>]*)>?$%', $content, $matches)) {
return '';
}
$slash = trim($matches[1]);
$elem = $matches[2];
$attrlist = $matches[3];
if (!is_array($allowed_html)) {
$allowed_html = wp_kses_allowed_html($allowed_html);
}
// They are using a not allowed HTML element.
if (!isset($allowed_html[strtolower($elem)])) {
return '';
}
// No attributes are allowed for closing elements.
if ('' !== $slash) {
return "</{$elem}>";
}
return wp_kses_attr($elem, $attrlist, $allowed_html, $allowed_protocols);
}