<?php
$selfClosing = explode(',', 'area,base,basefont,br,col,frame,hr,img,input,isindex,link,meta,param,embed');
$html = '
<p><a href="#">foo</a></p>
<hr/>
<br/>
<div>name</div>';
$dom = new DOMDocument();
$dom->loadHTML($html);
$els = $dom->getElementsByTagName('*');
foreach ( $els as $el ) {
$nodeName = strtolower($el->nodeName);
if ( !in_array( $nodeName, $selfClosing ) ) {
var_dump( $nodeName );
}
}
Выход:
string(4) "html"
string(4) "body"
string(1) "p"
string(1) "a"
string(3) "div"
В основном просто определяют имена узлов узлов, которые закрываются самостоятельно, загружают всю строку html в библиотеку DOM, захватывают все элементы, перебирают и отфильтровывают которые не закрываются и не работают на них.
Я уверен, что вы уже знаете, что вам не следует использовать регулярное выражение для этой цели.
Вы создаете новый объект, используя type
, wich
, selected
и hovered
const type = 'value of type';
const which = 'value of which';
const selected = {propOfSelected:'value1',sharedProp:'value1'};
const hovered = {sharedProp:'value2',newProp:'value of new prop'};
console.log({ type, which, selected: { ...selected, ...hovered } })
Похоже,
{ type, which, selected: { ...selected, ...hovered } }
некоторые переменные объединены в один объект, как
type
which
selected
со свойствами selected
, который содержит объект hovered
, который также содержит объект со свойствами сокращения и расширенным синтаксисом ...
для объектов.
Выражение
{ type, which, selected: { ...selected, ...hovered } }
почти 1 sup> эквивалентно
{
"type": type,
"which": which,
"selected": Object.assign({}, selected, hovered)
}
, где type
, which
, selected
и [ 115] являются локальными переменными. Другими словами, "type"
и "which"
задаются с помощью сокращения свойства , а "selected"
указывается явно как поверхностное слияние selected
и hovered
.
1 sup> Я говорю «почти», потому что Object.assign
запускает установщики свойств, а ...
синтаксис расширения объекта - нет.