WordPress Version: 5.6
/**
* Adds `rel="noopener"` to all HTML A elements that have a target.
*
* @since 5.1.0
* @since 5.6.0 Removed 'noreferrer' relationship.
*
* @param string $text Content that may contain HTML A elements.
* @return string Converted content.
*/
function wp_targeted_link_rel($text)
{
// Don't run (more expensive) regex if no links with targets.
if (stripos($text, 'target') === false || stripos($text, '<a ') === false || is_serialized($text)) {
return $text;
}
$script_and_style_regex = '/<(script|style).*?<\/\1>/si';
preg_match_all($script_and_style_regex, $text, $matches);
$extra_parts = $matches[0];
$html_parts = preg_split($script_and_style_regex, $text);
foreach ($html_parts as &$part) {
$part = preg_replace_callback('|<a\s([^>]*target\s*=[^>]*)>|i', 'wp_targeted_link_rel_callback', $part);
}
$text = '';
for ($i = 0; $i < count($html_parts); $i++) {
$text .= $html_parts[$i];
if (isset($extra_parts[$i])) {
$text .= $extra_parts[$i];
}
}
return $text;
}