从 PHP 中的字符串中提取 html 属性

Web*_*urk 5 php arrays parsing dom function

我有一个看起来像这样的变量:

$var = '<li data-tpl-classname="class" data-tpl-title="innerHTML"></li>'
Run Code Online (Sandbox Code Playgroud)

我想以某种方式提取 data-tpl-attributes,所以我最终得到一个如下所示的结果数组:

$array = (
    'classname' => 'class',
    'title' => 'innerHTML'
)
Run Code Online (Sandbox Code Playgroud)

“data-tpl-”属性的数量各不相同,它并不总是一个<li>元素。除此之外,它始终遵循相同的格式:data-tpl-attributename="attributePlacement".

如何在不使用正则表达式的情况下检索这些属性并将它们存储在数组中?我说没有正则表达式,因为在我看来,使用正则表达式解析 html 似乎是一种邪恶的做法,或者在这种情况下可以吗?

Sha*_*ran 6

您可以很好地使用 DOMDocument 类,是的,不要使用正则表达式。这只是一个开始,您可以很好地探索它。

<?php
$var = '<li data-tpl-classname="class" data-tpl-title="innerHTML"></li>';
echo "<pre>";

function parseTag($content,$tg)
{
    $dom = new DOMDocument;
    $dom->loadHTML($content);
    $attr = array();
    foreach ($dom->getElementsByTagName($tg) as $tag) {
        foreach ($tag->attributes as $attribName => $attribNodeVal)
        {
           $attr[$attribName]=$tag->getAttribute($attribName);
        }
    }
    return $attr;
}

$attrib_arr = parseTag($var,'li');
print_r($attrib_arr);
Run Code Online (Sandbox Code Playgroud)

OUTPUT :

Array
(
    [data-tpl-classname] => class
    [data-tpl-title] => innerHTML
)
Run Code Online (Sandbox Code Playgroud)

Demo


Bal*_*rga 4

您可以使用一些字符串函数提取值。它看起来像这样:

$test1 = '<li data-tpl-classname="class" data-tpl-title="innerHTML"></li>';
$test2 = '<div data-tpl-anything="something" data-tpl-title="this is a title" data-tpl-third="asdasd"></div>';

var_dump(extract_tpl($test1));
var_dump(extract_tpl($test2));

function extract_tpl($string,$prefix="data-tpl-") {
    $start = 0;
    $end = 0;

    while(strpos($string,$prefix,$end))
    {
        $start = strpos($string,$prefix,$start)+strlen($prefix);
        $end = strpos($string,'"',$start)-1;
        $end2 = strpos($string,'"',$end+2);
        $array[substr($string,$start,$end-$start)] = substr($string,$end+2,$end2-$end-2);
    }

    return $array;
}
Run Code Online (Sandbox Code Playgroud)

输出:

array (size=2)
  'classname' => string 'class' (length=5)
  'title' => string 'innerHTML' (length=9)

array (size=3)
  'anything' => string 'something' (length=9)
  'title' => string 'this is a title' (length=15)
  'third' => string 'asdasd' (length=6)
Run Code Online (Sandbox Code Playgroud)

代码中的数字(-1,+2,...)用于跳过“”等符号。