You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

80 lines
1.8 KiB
PHP

<?php
/**
* The HTML helpers.
*
* @since 1.0.0
* @package RankMath
* @subpackage RankMath\Helpers
* @author RankMath <support@rankmath.com>
*/
namespace RankMath\Helpers;
/**
* HTML class.
*/
class HTML {
/**
* Extract attributes from a html tag.
*
* @param string $elem Extract attributes from tag.
*
* @return array
*/
public static function extract_attributes( $elem ) {
$regex = '#([^\s=]+)\s*=\s*(\'[^<\']*\'|"[^<"]*")#';
preg_match_all( $regex, $elem, $attributes, PREG_SET_ORDER );
$new = [];
$remaining = $elem;
foreach ( $attributes as $attribute ) {
$val = substr( $attribute[2], 1, -1 );
$new[ $attribute[1] ] = $val;
$remaining = str_replace( $attribute[0], '', $remaining );
}
// Chop off tag name.
$remaining = preg_replace( '/<[^\s]+/', '', $remaining, 1 );
// Check for empty attributes without values.
$regex = '/([^<][\w\d:_-]+)[\s>]/i';
preg_match_all( $regex, $remaining, $attributes, PREG_SET_ORDER );
foreach ( $attributes as $attribute ) {
$new[ trim( $attribute[1] ) ] = null;
}
return $new;
}
/**
* Generate html attribute string for array.
*
* @param array $attributes Contains key/value pair to generate a string.
* @param string $prefix If you want to append a prefic before every key.
*
* @return string
*/
public static function attributes_to_string( $attributes = [], $prefix = '' ) {
// Early Bail!
if ( empty( $attributes ) ) {
return false;
}
$out = '';
foreach ( $attributes as $key => $value ) {
if ( true === $value || false === $value ) {
$value = $value ? 'true' : 'false';
}
$out .= ' ' . esc_html( $prefix . $key );
if ( null === $value ) {
continue;
}
$out .= sprintf( '="%s"', esc_attr( $value ) );
}
return $out;
}
}