Php 将textarea值迭代到数组值
我在文本区域中有如下html: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]
<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>
)
)