Добавление тега attr в html через PHP - PullRequest
0 голосов
/ 26 июня 2018

Я хотел бы добавить другое свойство и значение в мой объект HTML, но вместо этого он заменяет текущее значение.

Это то, что я до сих пор кодировал в своем PHP-файле.

function htmlEncode ( $html ){

$html = preg_replace('~>\s+<~', '><', $html);
$html = html_entity_decode($html);

$dom = new DOMDocument();
$dom->loadHTML($html);

foreach($dom->getElementsByTagName('*') as $div){

    foreach ($div->attributes as $attr) {

        if($div->nodeName == "h2"){
            $class = $attr->nodeName;
            $className = $attr->nodeValue;
            $div->setAttribute("aria-label", $div->nodeValue);  

            $result = [
                 "tagName" => $div->nodeName, 
                 "value" => $div->nodeValue, 
                 $class=> $className, 
                 $attr->nodeName => $attr->nodeValue
            ];
        } else {
            $result[] = [
                 "tagName" => $div->nodeName, 
                 "value" => $div->nodeValue,
                 $attr->nodeName => $attr->nodeValue
           ];
        }
    }       
}

$json = json_encode($result, JSON_UNESCAPED_UNICODE);

return $json;
}

но когда я запускаю код

echo json_encode($attr->nodeName);

Я получаю два атрибута:

"класс" "aria-label"

Ответы [ 2 ]

0 голосов
/ 26 июня 2018

Попробуйте приведенный ниже код. Сделано изменений:

1. $class[] = array();

2. $class[$attr->nodeName] = $attr->nodeValue;
3. Removed `class` from results
4. Added 
            foreach($class as $key=>$classValues){
                if(!empty($classValues)){
                     $result[$key] = $classValues;     
                }
             }

Полный код:

function htmlEncode ( $html ){

$html = preg_replace('~>\s+<~', '><', $html);
$html = html_entity_decode($html);

$dom = new DOMDocument();
$dom->loadHTML($html);

foreach($dom->getElementsByTagName('*') as $div){
    $class[] = array();
    foreach ($div->attributes as $attr) {
        if($div->nodeName == "h2"){
            $class[$attr->nodeName] = $attr->nodeValue;
            $div->setAttribute("aria-label", $div->nodeValue);

            $result = [
                 "tagName" => $div->nodeName, 
                 "value" => $div->nodeValue,
                 $attr->nodeName => $attr->nodeValue
            ];
            foreach($class as $key=>$classValues){
                 if(!empty($classValues)){
                        $result[$key] = $classValues;     
                 }
            }
        } else {
            $result[] = [
                 "tagName" => $div->nodeName, 
                 "value" => $div->nodeValue,
                 $attr->nodeName => $attr->nodeValue
           ];
        }
    }       
}

$json = json_encode($result, JSON_UNESCAPED_UNICODE);

return $json;
}
0 голосов
/ 26 июня 2018

Попробуйте добавить новую строку

$div->setAttribute("class", $div->nodeValue);
$div->setAttribute("aria-label", $div->nodeValue);
...