【问题标题】:HTML DOM: remove specific div based on data attribute value using phpHTML DOM:使用php根据数据属性值删除特定的div
【发布时间】:2020-07-13 10:46:54
【问题描述】:

我是codeigniter的新手。我得到的html字符串表单数据库如下所示

<div class="rockfm-form-container uiform-wrap">
<div class="rockfm-alert-container"></div>
<form class="rockfm-form" action="" name="" method="post" data-zgfm-type="1" enctype="multipart/form-data" id="rockfm_form_7">
<input type="hidden" value="7" class="_rockfm_form_id" name="_rockfm_form_id"> 
<input type="hidden" value="0" class="_rockfm_wizard_st" > 
<input type="hidden" value="PGRpdiBjbGFzcz0icm9ja2ZtLWFsZXJ0IHJvY2tmbS1hbGVydC1zdWNjZXNzIj5TdWNjZXNzISBGb3JtIHdhcyBzZW50IHN1Y2Nlc3NmdWxseS48L2Rpdj4=" name="_rockfm_onsubm_smsg" class="_rockfm_onsubm_smsg" > <!--- ajax or post ---> 
<input type="hidden" value="1" class="_rockfm_type_submit" name="_rockfm_type_submit"> 
<input type="hidden" value="rocket_front_submitajaxmode" name="action"> 
<div class="uiform-main-form">
 <div class="uiform-step-content" >
    <div id="rockfm_uiibpy0eewu" data-idfield="uiibpy0eewu" data-typefield="33" class="rockfm-heading rockfm-field " ></div>
    <div id="rockfm_uiya0wevyae" data-idfield="uiya0wevyae" data-typefield="28" class="rockfm-preptext rockfm-field rockfm-required " data-val-type="4"></div>
    <div id="rockfm_ui04fxilqp6" data-idfield="ui04fxilqp6" data-typefield="7" class="rockfm-textarea rockfm-field " ></div>
    <div id="rockfm_uiwdtl19w05" data-idfield="uiwdtl19w05" data-typefield="10" class="rockfm-select rockfm-field " ></div>
    <div id="rockfm_uiksx46ggj9" data-idfield="uiksx46ggj9" data-typefield="12" class="rockfm-fileupload rockfm-field " ></div>
    <div id="rockfm_ui2jrdo8mcp" data-idfield="ui2jrdo8mcp" data-typefield="20" class="rockfm-submitbtn rockfm-field " ></div>
 </div>
</div>
</form>
</div>

我有另一个类型字段表,如图所示

html 字符串转换为 DOM 并添加检查条件 if typefieldid = 10 is flag_status = 0 然后仅删除此 div &lt;div id="rockfm_uiwdtl19w05" data-idfield="uiwdtl19w05" data-typefield="10" class="rockfm-select rockfm-field " &gt;&lt;/div&gt; 但这给了我这样的代码

<div id="rockfm_uiibpy0eewu" data-idfield="uiibpy0eewu" data-typefield="33" class="rockfm-heading rockfm-field "></div>
<div id="rockfm_uiya0wevyae" data-idfield="uiya0wevyae" data-typefield="28" class="rockfm-preptext rockfm-field rockfm-required "></div>
<div id="rockfm_ui04fxilqp6" data-idfield="ui04fxilqp6" data-typefield="7" class="rockfm-textarea rockfm-field "></div>
<div id="rockfm_uiksx46ggj9" data-idfield="uiksx46ggj9" data-typefield="12" class="rockfm-fileupload rockfm-field "></div>
<div id="rockfm_ui2jrdo8mcp" data-idfield="ui2jrdo8mcp" data-typefield="20" class="rockfm-submitbtn rockfm-field "></div>

问题是当 typefield = 10 是 flag_status = 0 时,它的删除 &lt;div id="rockfm_uiwdtl19w05" data-idfield="uiwdtl19w05" data-typefield="10" class="rockfm-select rockfm-field " &gt;&lt;/div&gt; 但 html 字符串中的其他信息也被删除。我展示了控制器函数的代码,其中我将 html 字符串转换为 DOM 文档,获取 fby_idflag_status 表单类型字段表的记录并制作此记录的数组。然后使用 DOM 查询进行数据类型字段的 foreach 循环以获取数据类型字段的属性值,然后为 if 0 = 1 添加检查条件,然后删除特定的 div

还有一个问题是如何在根据条件删除特定 div 后在视图文件中传递和显示最终数据。这是控制器功能的代码

public function getform() {

$form_id = ($this->input->post('id')) ? Uiform_Form_Helper::sanitizeInput($this->input->post('id')) : 0;

$data = array();

if (intval($form_id) === 0) {
    return;
} else {


    $rdata = $this->model_forms->getFormById($form_id);
}


$response = array();
if (!empty($rdata)) {
    $response['html_content'] = Uiform_Form_Helper::encodeHex($rdata->fmb_html);
}

$html = $rdata->fmb_html;
$doc = new DOMDocument();
$doc->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$xpath = new DOMXPath($doc);

$fields = $this->model_fields->getAllFieldsType();

$field_array =array();
 foreach ($fields as $value) {

    $field_array[$value->fby_id] = $value->flag_status;

}

foreach ($xpath->query("//div[@data-typefield]") as $item) 
{

    $typefield = $item->getAttribute('data-typefield');

    if($field_array[$typefield] == 1)
    {
        $item->outertext = '';

        $doc->saveHTML($item);
    }


}

$data = array();

$json = $response;
$data['json'] = $response;

$this->load->view('html_view', $data);
}

请指导我是否有任何选项可以从 HTML DOM 中仅删除特定的 div。我希望我的代码像这样输出

<div class="rockfm-form-container uiform-wrap">
<div class="rockfm-alert-container"></div>
<form class="rockfm-form" action="" name="" method="post" data-zgfm-type="1" enctype="multipart/form-data" id="rockfm_form_7">
<input type="hidden" value="7" class="_rockfm_form_id" name="_rockfm_form_id"> 
<input type="hidden" value="0" class="_rockfm_wizard_st" > 
<input type="hidden" value="PGRpdiBjbGFzcz0icm9ja2ZtLWFsZXJ0IHJvY2tmbS1hbGVydC1zdWNjZXNzIj5TdWNjZXNzISBGb3JtIHdhcyBzZW50IHN1Y2Nlc3NmdWxseS48L2Rpdj4=" name="_rockfm_onsubm_smsg" class="_rockfm_onsubm_smsg" > <!--- ajax or post ---> 
<input type="hidden" value="1" class="_rockfm_type_submit" name="_rockfm_type_submit"> 
<input type="hidden" value="rocket_front_submitajaxmode" name="action"> 
<div class="uiform-main-form">
  <div class="uiform-step-content" >
     <div id="rockfm_uiibpy0eewu" data-idfield="uiibpy0eewu" data-typefield="33" class="rockfm-heading rockfm-field " ></div>
     <div id="rockfm_uiya0wevyae" data-idfield="uiya0wevyae" data-typefield="28" class="rockfm-preptext rockfm-field rockfm-required " data-val-type="4"></div>
     <div id="rockfm_ui04fxilqp6" data-idfield="ui04fxilqp6" data-typefield="7" class="rockfm-textarea rockfm-field " ></div>
     <div id="rockfm_uiksx46ggj9" data-idfield="uiksx46ggj9" data-typefield="12" class="rockfm-fileupload rockfm-field " ></div>
     <div id="rockfm_ui2jrdo8mcp" data-idfield="ui2jrdo8mcp" data-typefield="20" class="rockfm-submitbtn rockfm-field " ></div>
   </div>
 </div>
 </form>
</div>

【问题讨论】:

    标签: php html codeigniter


    【解决方案1】:

    您的代码大部分都在那里,但主要部分是删除节点,我已将测试更改为状态 = 0,然后使用 removeChild() 删除该元素。那么文档最后应该只包含你想要的&lt;div&gt;元素...

    foreach ($xpath->query("//div[@data-typefield]") as $item)
    {
        $typefield = $item->getAttribute('data-typefield');
        if($field_array[$typefield] == 0)
        {
            $item->parentNode->removeChild($item);
        }
    }
    
    echo $doc->saveHTML();
    

    【讨论】:

    • 我正在寻找的这个解决方案运行良好
    猜你喜欢
    • 2012-05-28
    • 1970-01-01
    • 1970-01-01
    • 2021-11-08
    • 1970-01-01
    • 1970-01-01
    • 2012-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多