Php 将textarea值迭代到数组值

Php 将textarea值迭代到数组值,php,Php,我在文本区域中有如下html: <dl> <dt>lorem</dt> <dd> <h1>heading</h1> <p>ipsum</p> </dd> </dl> Array ( [0] => <dl> [1] => <dt>lorem</dt> [2]

我在文本区域中有如下html:

<dl>
  <dt>lorem</dt>
  <dd>
    <h1>heading</h1>
    <p>ipsum</p>
  </dd>
</dl>
Array ( [0] =>
  <dl>
      [1] =>
         <dt>lorem</dt>
      [2] =>
         <dd>
             [3] =>
                 <h1>heading</h1>
             [4] =>
                 <p>ipsum</p>
                 [5] =>
          </dd>
          [6] =>
    </dl>
)
结果如下:

<dl>
  <dt>lorem</dt>
  <dd>
    <h1>heading</h1>
    <p>ipsum</p>
  </dd>
</dl>
Array ( [0] =>
  <dl>
      [1] =>
         <dt>lorem</dt>
      [2] =>
         <dd>
             [3] =>
                 <h1>heading</h1>
             [4] =>
                 <p>ipsum</p>
                 [5] =>
          </dd>
          [6] =>
    </dl>
)

使用PHP的strip tags函数

echo(带标签($value))


虽然我不建议您使用foreach来迭代数组(您应该使用while),但这是您问题的解决方案:

foreach ($arr as $key => $value)
     if (strpos($value, 'dt') !== false) {
          $dt = $value;
     } else if (strpos($value, 'dd') !== false) {
          $dd = $value;
     }
}

我建议您使用原生PHPDOM扩展,以避免在html解析中遇到困难

下面是一个简单的示例,介绍如何实现您的目标:

<?php 

$dom = new DOMDocument('1.0', 'iso-8859-1');
$dom->loadHTML($your_html_string);
$dom = $dom->getElementById($id_of_your_textarea);
foreach ($dls as $dl) {
    echo $dl->nodeValue;
}

使用
DOMDocument
的功能:

$html_str = '<dl>
  <dt>lorem</dt>
  <dd>
    <h1>heading</h1>
    <p>ipsum</p>
  </dd>
  <dt>lorem2</dt>
  <dd>
    <h1>heading2</h1>
    <p>ipsum2</p>
  </dd>
</dl>';

function grabTextareaDl($html_str, $type = 'text') {
    $doc = new DOMDocument();
    $doc->loadHTML($html_str);
    $dl = $doc->getElementsByTagName("dl")->item(0);
    $dt = $dd = [];
    $getInnerHtml = function(DOMNode $node){
        $html = "";
        foreach ($node->childNodes as $n) {
            $html .= $node->ownerDocument->saveHTML($n);
        }
        return $html;
    };

    foreach ($dl->childNodes as $n) {
        if ($n->nodeName == 'dt' || $n->nodeName == 'dd') {
            if ($type == 'html') {                
                ${$n->nodeName}[] = $getInnerHtml($n);
            } else {
                ${$n->nodeName}[] = $n->nodeValue;
            }
        }
    }

    return ['dt' => $dt, 'dd' => $dd];
}

print_r(grabTextareaDl($html_str));

输出(html):

数组
(
[dt]=>阵列
(
[0]=>lorem
[1] =>lorem2
)
[dd]=>阵列
(
[0] => 
标题
ipsum

[1] => 标题2 ipsum2

) )
您最好使用一些库来解析DOM:有没有其他方法,而不是使用lib?RegExp来匹配标记和标记本身之间的文本,但这是错误的方法?我的意思是,有其他方法将数据放在textarea中,以便我可以轻松获取?取决于您想对该数据做什么,以及如何获取它(人工输入,通过脚本生成,等等)以及数据本身的性质。这将完全删除html标记。我仍然想要html输入dd和dt。谢谢你的回答。但我不想得到dt和dd标签。我只想在它们里面得到文本/ HTML。我可以在DL中使用很多DD——考虑使用DT和DD作为数组:<代码> $Dt= $DD=’’;…$dt[]=$n->nodeValue是的,我添加了更复杂的示例(具有多个
dt
/
dd
)并扩展了我的解决方案。看看这个
Array
(
    [dt] => Array
        (
            [0] => lorem
            [1] => lorem2
        )
    [dd] => Array
        (
            [0] => 
    heading
    ipsum

            [1] => 
    heading2
    ipsum2

        )
)
print_r(grabTextareaDl($html_str, "html"));
Array
(
    [dt] => Array
        (
            [0] => lorem
            [1] => lorem2
        )

    [dd] => Array
        (
            [0] => 
    <h1>heading</h1>
    <p>ipsum</p>

            [1] => 
    <h1>heading2</h1>
    <p>ipsum2</p>

        )
)