国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

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

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程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 定陶县| 沙湾县| 休宁县| 凤冈县| 江山市| 玛曲县| 刚察县| 卢湾区| 阿克陶县| 浮梁县| 旺苍县| 开化县| 康保县| 新和县| 若尔盖县| 大新县| 沂源县| 绥化市| 宁河县| 吴堡县| 和平县| 北海市| 宣武区| 漳平市| 和龙市| 长垣县| 凌源市| 本溪| 五原县| 青田县| 资阳市| 乌什县| 舞阳县| 外汇| 博湖县| 临桂县| 邳州市| 洪雅县| 斗六市| 秦安县| 乌拉特前旗|