亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 網站 > 建站經驗 > 正文

php實現html標簽閉合檢測與修復方法

2024-04-25 20:38:44
字體:
來源:轉載
供稿:網友

本文實例講述了php實現html標簽閉合檢測與修復方法。分享給大家供大家參考。具體如下:

html標簽閉合檢測與修復,說的有點大 , 并沒有考慮的很完整,沒有使用正則表達式, 適用于html文件中只有開始標簽沒有結束標簽, 是有結束標簽沒有開始標簽的情況。標簽閉合的位置需要根據需求調整

<?php

$str = '

<div data="<li></li>">

<img src="http://www.baidu.com/123123.png"/>

<div2>

<a>content</a>

</div2>

<ul>

<li>

</li>

</ul>

<p>

content full

</p>

this is content</test1>

this is content</test2>

<test4 data="liujinjing"> This is cont

<li></li>

<test3 data="liujinjing"> This is content

<div3>

</div3>

</div4>

</div>

</div>

<div6 style="width:90px; "> this is content';

$str_len = strlen($str);

//記錄起始標簽

$pre_data = array();

//記錄起始標簽位置

$pre_pos = array();

$last_data = array();

$error_data = array();

$error_pos = array();

$i = 0;

//標記為 < 開始

$start_flag = false;

while( $i < $str_len ) {

if($str[$i]=="<" && $str[$i+1]!='/' && $str[$i+1]!='!') {

$i++;

$_tmp_str = '';

//標記為 < 開始

$start_flag = true;

//標記空白

$space_flag = false;

while($str[$i]!=">" && $str[$i]!="'" && $str[$i]!='"' && $str[$i] !='/' && $i<$str_len){

if($str[$i]==' ') {

$space_flag = true;

}

if(!$space_flag) {

$_tmp_str .= $str[$i];

}

$i++;

}

$pre_data[] = $_tmp_str;

$pre_pos[] = $i;

} else if ($str[$i]=="<" && $str[$i+1]=='/') {

$i += 2;

$_tmp_str = '';

while($str[$i]!=">" && $i<$str_len){

$_tmp_str .= $str[$i];

$i++;

}

$last_data[] = $_tmp_str;

//查看開始標簽的上一個值

if(count($pre_data)>0) {

$last_pre_node = getLastNode($pre_data, 1);

if($last_pre_node == $_tmp_str) {

//配對上, 刪除對應位置的值

array_pop($pre_data);

array_pop($pre_pos);

array_pop($last_data);

} else {

//沒有配對上, 有兩種情況

//情況一: 只有閉合標簽, 沒有開始標簽

//情況二:只有開始標簽, 沒有閉合標簽

array_pop($last_data);

$error_data[] = $_tmp_str;

$error_pos[] = $i;

}

} else {

array_pop($last_data);

$error_data[] = $_tmp_str;

$error_pos[] = $i;

}

}else if ($str[$i]=="<" && $str[$i+1]=="!") {

$i++;

while($i<$str_len) {

if($str[$i]=="-" && $str[$i+1]=="-" && $str[$i+2]==">") {

$i++;

break;

} else {

$i++;

}

}

$i++;

}else if($str[$i]=='/' && $str[$i+1]=='>') {

//跳過自動單個閉合標簽

if($start_flag) {

array_pop($pre_data);

array_pop($pre_pos);

$i+=2;

}

}else if($str[$i]=="/" && $str[$i+1]=="*"){

$i++;

while($i<$str_len) {

if($str[$i]=="*" && $str[$i+1]=="/") {

$i++;

break;

} else {

$i++;

}

$i++;

}

}else if($str[$i]=="'"){

$i++;

while($str[$i]!="'" && $i<$str_len) {

$i++;

}

$i++;

} else if($str[$i]=='"'){

$i++;

while($str[$i]!='"' && $i<$str_len ) {

$i++;

}

$i++;

} else {

$i++;

}

}

//確定起始標簽的位置

function confirm_pre_pos($str, $pre_pos){

$str_len = strlen($str);

$j=$pre_pos;

while($j < $str_len) {

if($str[$j] == '"') {

$j++;

while ($j<$str_len) {

if($str[$j]=='"') {

$j++;

break;

}

$j++;

}

}

else if($str[$j] == "'") {

$j++;

while ($j<$str_len) {

if($str[$j]=="'") {

$j++;

break;

}

$j++;

}

}

else if($str[$j]==">") {

$j++;

while ($j<$str_len) {

if($str[$j]=="<") {

//退回到原有內容位置

$j--;

break;

}

$j++;

}

break;

}

else {

$j++;

}

}

return $j;

}

//確定起始標簽的位置

function confirm_err_pos($str, $err_pos){

$j=$err_pos;

$j--;

while($j > 0) {

if($str[$j] == '"') {

$j--;

while ($j<$str_len) {

if($str[$j]=='"') {

$j--;

break;

}

$j--;

}

}

else if($str[$j] == "'") {

$j--;

while ($j<$str_len) {

if($str[$j]=="'") {

$j--;

break;

}

$j--;

}

}

else if($str[$j]==">") {

$j++;

break;

}

else {

$j--;

}

}

return $j;

}

//獲取數組的倒數第num個值

function getLastNode(array $arr, $num){

$len = count($arr);

if($len > $num) {

return $arr[$len-$num];

} else {

return $arr[0];

}

}

//整理數據, 主要是向后看, 進一步進行檢查

function sort_data(&$pre_data, &$pre_pos, &$error_data, &$error_pos){

$rem_key_array = array();

$rem_i_array = array();

//獲取需要刪除的值

foreach($error_data as $key=>$value){

$count = count($pre_data);

for($i=($count-1) ; $i>=0; $i--) {

if($pre_data[$i] == $value && !in_array($i, $rem_i_array)) {

$rem_key_array[] = $key;

$rem_i_array[] = $i;

break;

}

}

}

//刪除起始標簽相應的值

foreach($rem_key_array as $_item) {

unset($error_pos[$_item]);

unset($error_data[$_item]);

}
//刪除結束標簽相應的值

foreach($rem_i_array as $_item) {

unset($pre_data[$_item]);

unset($pre_pos[$_item]);

}

}

//整理數據, 閉合標簽

function modify_data($str, $pre_data, $pre_pos, $error_data, $error_pos){

$move_log = array();

//只有閉合標簽的數據

foreach ($error_data as $key => $value) {

// code...

$_tmp_move_count = 0;

foreach ($move_log as $pos_key => $move_value) {

// code...

if($error_pos[$key]>=$pos_key) {

$_tmp_move_count += $move_value;

}

}

$data = insert_data($str, $value, $error_pos[$key]+$_tmp_move_count, false);

$str = $data['str'];

$move_log[$data['pos']] = $data['move_count'];

}

//只有起始標簽的數據

foreach ($pre_data as $key => $value) {

// code...

$_tmp_move_count = 0;

foreach ($move_log as $pos_key => $move_value) {

// code...

if($pre_pos[$key]>=$pos_key) {

$_tmp_move_count += $move_value;

}

}

$data = insert_data($str, $value, $pre_pos[$key]+$_tmp_move_count, true);

$str = $data['str'];

$move_log[$data['pos']] = $data['move_count'];

}

return $str;

}

//插入數據, $type 表示插入數據的方式

function insert_data($str, $insert_data, $pos, $type) {

$len = strlen($str);

//起始標簽類型

if($type==true) {

$move_count = strlen($insert_data)+3;

$pos = confirm_pre_pos($str, $pos);

$pre_str = substr($str, 0, $pos);

$end_str = substr($str, $pos);

$mid_str = "</" . $insert_data . ">";

//閉合標簽類型

} else {

$pos = confirm_err_pos($str, $pos);

$move_count = strlen($insert_data) + 2;

$pre_str = substr($str, 0, $pos);

$end_str = substr($str, $pos);

$mid_str = "<" . $insert_data . ">";

}

$str = $pre_str.$mid_str.$end_str;

return array('str'=>$str, 'pos'=>$pos, 'move_count'=>$move_count);

}

sort_data($pre_data, $pre_pos, $error_data, $error_pos);

$new_str = modify_data($str, $pre_data, $pre_pos, $error_data, $error_pos);

echo $new_str;

// print_r($pre_data);

// print_r($pre_pos);

// print_r($error_data);

// print_r($error_pos);

// echo strlen($str);

// foreach($pre_pos as $value){

// $value = confirm_pre_pos($str, $value);

// for($i=$value-5; $i<=$value; $i++) {

// echo $str[$i];

// }

// echo "/n";

// }

// foreach($error_pos as $value){

// for($i=$value-5; $i<=$value; $i++) {

// echo $str[$i];

// }

// echo "/n";

// }

?>

希望本文所述對大家的php程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲国产小视频| 中文欧美日本在线资源| 亚洲欧美一区二区三区四区| 国产精品扒开腿爽爽爽视频| 91精品国产九九九久久久亚洲| 91九色综合久久| 亚洲欧美成人精品| 欧美一性一乱一交一视频| 亚洲欧洲成视频免费观看| 久久久久一本一区二区青青蜜月| 97在线视频免费看| 亚洲人成免费电影| 亚洲人午夜精品免费| 中文字幕亚洲第一| 国产成人拍精品视频午夜网站| 中文字幕亚洲欧美在线| 欧美精品videosex牲欧美| 亚洲午夜精品久久久久久久久久久久| 久久成人亚洲精品| 国产精品免费久久久久影院| 一区二区三区久久精品| 色yeye香蕉凹凸一区二区av| 91夜夜未满十八勿入爽爽影院| 精品激情国产视频| 91九色单男在线观看| 久久久久久久久久久国产| www.99久久热国产日韩欧美.com| 91精品国产综合久久久久久蜜臀| 午夜精品三级视频福利| 日韩美女激情视频| 亚洲一品av免费观看| 3344国产精品免费看| 欧美日本啪啪无遮挡网站| 亚洲欧美视频在线| 亚洲韩国欧洲国产日产av| 午夜精品一区二区三区视频免费看| 久久免费少妇高潮久久精品99| 精品欧美国产一区二区三区| 欧美激情xxxx| 7777免费精品视频| 57pao精品| 国产精品天天狠天天看| 国产精品∨欧美精品v日韩精品| 欧美专区福利在线| 成人欧美一区二区三区黑人孕妇| 欧美一级淫片videoshd| 国产精品r级在线| 欧美激情影音先锋| 欧美日韩中文在线观看| 一区二区成人精品| 在线丨暗呦小u女国产精品| 中文字幕视频一区二区在线有码| 欧美在线视频在线播放完整版免费观看| 日韩免费观看高清| 亚洲最大激情中文字幕| 亚洲综合在线做性| 日韩在线观看免费网站| 亚洲字幕一区二区| 亚洲国产精品女人久久久| 欧美极品少妇xxxxⅹ喷水| 亚洲欧洲日韩国产| 欧美国产日韩二区| 日韩小视频在线| 日韩激情视频在线| 国产精品一二三视频| 欧美激情高清视频| 亚洲第一综合天堂另类专| 亚洲第一区在线观看| 成人激情免费在线| 亚洲成人久久一区| 少妇激情综合网| 另类少妇人与禽zozz0性伦| 国产精品96久久久久久又黄又硬| 欧美日韩国产精品一区二区不卡中文| 欧美精品激情在线观看| 久久久久久久香蕉网| 久久精品91久久香蕉加勒比| 精品夜色国产国偷在线| 亚洲精品日韩久久久| 亚洲欧美中文字幕在线一区| 日韩在线激情视频| 色噜噜狠狠狠综合曰曰曰88av| 色偷偷888欧美精品久久久| 一区二区三区天堂av| 欧美国产日韩一区二区| 国产男人精品视频| 51久久精品夜色国产麻豆| 亚洲xxxxx电影| 亚洲国产精品字幕| 国产精品麻豆va在线播放| 欧美中文字幕在线| 69影院欧美专区视频| 国产精品成人一区二区三区吃奶| 成人网在线免费观看| 国产精品久久久久久搜索| 日韩精品在线观看视频| 欧美日韩国产精品一区二区三区四区| 国产精品6699| 57pao成人国产永久免费| 欧美日韩亚洲视频| 日韩精品久久久久| 亚洲www在线观看| 91av在线不卡| 在线观看免费高清视频97| 成人欧美一区二区三区在线湿哒哒| 久久亚洲精品中文字幕冲田杏梨| 欧美激情性做爰免费视频| 精品国产一区二区三区久久| 成人高清视频观看www| 欧美日韩国产成人在线观看| 国产精品精品视频一区二区三区| 国产亚洲精品一区二555| 91精品国产综合久久香蕉的用户体验| 在线播放日韩精品| 亚洲国产精品久久久久久| 国产亚洲精品成人av久久ww| 国产精品嫩草视频| 亚洲男人天堂视频| 欧美日韩中文字幕在线| 欧美国产日韩精品| 岛国av一区二区在线在线观看| 97在线视频免费播放| 日韩欧美国产高清91| 中文日韩在线视频| 中文字幕9999| 国产精品影片在线观看| 亚洲欧美综合精品久久成人| 欧美性开放视频| 欧美日韩在线观看视频小说| 欧美一区亚洲一区| 欧美另类69精品久久久久9999| 亚洲国产精品大全| 中文字幕亚洲欧美一区二区三区| 国产精品xxx视频| 欧美黑人一区二区三区| 国产精品一香蕉国产线看观看| 日韩视频在线一区| 欧美成人在线免费视频| 亚洲香蕉成人av网站在线观看| 日韩精品中文字幕在线| 色樱桃影院亚洲精品影院| 中文字幕在线看视频国产欧美| 国产精品爽爽ⅴa在线观看| 奇米影视亚洲狠狠色| 国产美女久久精品| 91丨九色丨国产在线| 欧美极品美女电影一区| 国产精品露脸av在线| 欧美大尺度在线观看| 粉嫩av一区二区三区免费野| 亚洲小视频在线观看| 九九精品在线观看| 亚洲男人天堂久| 欧美日韩国产综合视频在线观看中文| 亚洲tv在线观看| 最近免费中文字幕视频2019| 中文字幕欧美日韩精品| 国产日产亚洲精品| 国产成人精品久久二区二区91| 色久欧美在线视频观看| 国产成人精品午夜| 亚洲精品视频在线播放| 欧美性精品220| 91在线无精精品一区二区|