如何在纯 PHP 中获取起始 HTML 标记?

Posted

技术标签:

【中文标题】如何在纯 PHP 中获取起始 HTML 标记?【英文标题】:How to get the starting HTML tag in pure PHP? 【发布时间】:2020-12-27 16:20:24 【问题描述】:

我需要获取现有表单的起始 <form> 标记,原样,带有属性,没有内容和结束 </form> 标记,以将其用于新的动态创建的表单.所以,我只需要字符串<form method="post" class="form" data-id="19" data-title="Schema" data-slug="schema" data-message-success="Success!" data-message-invalid-email="Not valid!" data-message-required-field-missing="All fields are required!" data-message-error="Error!"> 在纯php中如何做到这一点?

我的表格:

<form method="post" class="form" data-id="19" data-title="Schema" data-slug="schema" data-message-success="Success!" data-message-invalid-email="Not valid!" data-message-required-field-missing="All fields are required!" data-message-error="Error!">

--- Form content ---

</form>

现在我只找到了如何获取表单属性以将它们添加到新表单。我知道,我可以循环并创建新表单,但我不是专家,我认为可以存在更优雅的解决方案。

function parseTag($content,$tg) 
    $dom = new DOMDocument('1.0', 'utf-8');
    $dom->loadhtml($content);
    $attr = array();
    foreach ($dom->getElementsByTagName($tg) as $tag) 
        foreach ($tag->attributes as $attribName => $attribNodeVal) 
            $attr[$attribName]=utf8_decode($tag->getAttribute($attribName));
        
    
    return $attr;


//$html variable contain the above form
$attrib_arr = parseTag($html,'form');
var_dump($attrib_arr);

输出:

array(9) 
  ["method"]=>
  string(4) "post"
  ["class"]=>
  string(19) "form"
  ["data-id"]=>
  string(2) "19"
  ["data-title"]=>
  string(23) "Schema"
  ["data-slug"]=>
  string(27) "schema"
  ["data-message-success"]=>
  string(50) "Success!"
  ["data-message-invalid-email"]=>
  string(52) "Not valid!"
  ["data-message-required-field-missing"]=>
  string(41) "All fields are required!"
  ["data-message-error"]=>
  string(25) "Error!"

【问题讨论】:

您需要什么结果?字符串&lt;form method="post" class="form" data-id="19" data-title="Schema" data-slug="schema" data-message-success="Success!" data-message-invalid-email="Not valid!" data-message-required-field-missing="All fields are required!" data-message-error="Error!"&gt;?还是这种形式的DOMNode?​​span> @Anton,是的,我只需要那个字符串:&lt;form method="post" ... &gt; 那么现在问题出在哪里,你已经拥有了所有的属性和它们的值——所以你可以遍历它,并从中创建相应的 HTML ......? @CBroe,是的,我知道并且我可以做到,但我不是专家,我想可以存在更优雅的解决方案。 【参考方案1】:

据我了解您的问题,您需要带有属性的打开表单标记。为此,您可以使用以下内容:

<?php
declare(strict_types=1);

$html = <<<HTML
<form method="post" class="form" data-id="19" data-title="Schema" data-slug="schema" data-message-success="Success!" data-message-invalid-email="Not valid!" data-message-required-field-missing="All fields are required!" data-message-error="Error!">
    --- Form content ---
    <div>with some tags</div>
</form>
HTML;

$doc = new DOMDocument('1.0', 'UTF-8');
$doc->loadHTML($html);

$xpath = new DOMXPath($doc);

foreach ($xpath->query('//form') as $formTag) 
    // remove child nodes of the form tag
    foreach ([...$formTag->childNodes] as $child) 
        $formTag->removeChild($child);
    

    // output as string, but remove the closing tag
    echo substr($doc->saveHTML($formTag), 0, -7);

(Demo)

【讨论】:

Yoshi,我很抱歉延长我的问题!是否有 $formTag-&gt;removeChild($child); 的反义词将孩子附加到我的表单中? 您拥有所有可用的DOM methods(例如appendChild)。尽管我假设您最终会希望通过字符串操作来扩展您的表单。如果不再是这种情况,我示例中的最后一行可能是多余的?! 谢谢!我在***.com 找到了一个很好的例子,我想出了如何调整您的代码以向表单添加新内容。再次感谢! :)

以上是关于如何在纯 PHP 中获取起始 HTML 标记?的主要内容,如果未能解决你的问题,请参考以下文章

如何在纯PHP项目中使用下载的库和composer?

如何在纯 Playground 文件中获取 CoreML

PHP/regex:如何获取 HTML 标签的字符串值?

如何从 PHP 中的以下 SOAP XML 响应中获取 pinBlocked 标记

如何在纯 HTML/JS 中应用 Tailwind UI 动画

如何使用PHP从此代码中的锚标记中提取id和url?