Rumah pembangunan bahagian belakang tutorial php html标签闭合检测与修复

html标签闭合检测与修复

Jul 25, 2016 am 09:01 AM

html标签闭合检测与修复,说的有点大 , 并没有考虑的很完整,没有使用正则表达式, 适用于html文件中只有开始标签没有结束标签, 是有结束标签没有开始标签的情况。标签闭合的位置需要根据需求调整
  1. $str = '
  2. html标签闭合检测与修复
  3. content
  4. content full
  5. this is content
  6. this is content
  7. This is cont
  8. This is content
  • 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
  • if($str[$i]==" $i++;
  • $_tmp_str = '';
  • //标记为 $start_flag = true;
  • //标记空白
  • $space_flag = false;
  • while($str[$i]!=">" && $str[$i]!="'" && $str[$i]!='"' && $str[$i] !='/' && $i
  • 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]=="
  • $i += 2;
  • $_tmp_str = '';
  • while($str[$i]!=">" && $i $_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]=="
  • $i++;
  • while($i
  • 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
  • if($str[$i]=="*" && $str[$i+1]=="/") {
  • $i++;
  • break;
  • } else {
  • $i++;
  • }
  • $i++;
  • }
  • }else if($str[$i]=="'"){
  • $i++;
  • while($str[$i]!="'" && $i $i++;
  • }
  • $i++;
  • } else if($str[$i]=='"'){
  • $i++;
  • while($str[$i]!='"' && $i $i++;
  • }
  • $i++;
  • } else {
  • $i++;
  • }
  • }
  • //确定起始标签的位置
  • function confirm_pre_pos($str, $pre_pos){
  • $str_len = strlen($str);
  • $j=$pre_pos;
  • while($j
  • if($str[$j] == '"') {
  • $j++;
  • while ($j if($str[$j]=='"') {
  • $j++;
  • break;
  • }
  • $j++;
  • }
  • }
  • else if($str[$j] == "'") {
  • $j++;
  • while ($j if($str[$j]=="'") {
  • $j++;
  • break;
  • }
  • $j++;
  • }
  • }
  • else if($str[$j]==">") {
  • $j++;
  • while ($j 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 if($str[$j]=='"') {
  • $j--;
  • break;
  • }
  • $j--;
  • }
  • }
  • else if($str[$j] == "'") {
  • $j--;
  • while ($j 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 = "";
  • }
  • $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// echo $str[$i];
  • // }
  • // echo "\n";
  • // }
  • // foreach($error_pos as $value){
  • // for($i=$value-5; $i// echo $str[$i];
  • // }
  • // echo "\n";
  • // }
  • ?>
  • 复制代码


    Kenyataan Laman Web ini
    Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

    Alat AI Hot

    Undresser.AI Undress

    Undresser.AI Undress

    Apl berkuasa AI untuk mencipta foto bogel yang realistik

    AI Clothes Remover

    AI Clothes Remover

    Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

    Undress AI Tool

    Undress AI Tool

    Gambar buka pakaian secara percuma

    Clothoff.io

    Clothoff.io

    Penyingkiran pakaian AI

    Video Face Swap

    Video Face Swap

    Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

    Alat panas

    Notepad++7.3.1

    Notepad++7.3.1

    Editor kod yang mudah digunakan dan percuma

    SublimeText3 versi Cina

    SublimeText3 versi Cina

    Versi Cina, sangat mudah digunakan

    Hantar Studio 13.0.1

    Hantar Studio 13.0.1

    Persekitaran pembangunan bersepadu PHP yang berkuasa

    Dreamweaver CS6

    Dreamweaver CS6

    Alat pembangunan web visual

    SublimeText3 versi Mac

    SublimeText3 versi Mac

    Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

    Jelaskan JSON Web Tokens (JWT) dan kes penggunaannya dalam PHP API. Jelaskan JSON Web Tokens (JWT) dan kes penggunaannya dalam PHP API. Apr 05, 2025 am 12:04 AM

    JWT adalah standard terbuka berdasarkan JSON, yang digunakan untuk menghantar maklumat secara selamat antara pihak, terutamanya untuk pengesahan identiti dan pertukaran maklumat. 1. JWT terdiri daripada tiga bahagian: header, muatan dan tandatangan. 2. Prinsip kerja JWT termasuk tiga langkah: menjana JWT, mengesahkan JWT dan muatan parsing. 3. Apabila menggunakan JWT untuk pengesahan di PHP, JWT boleh dijana dan disahkan, dan peranan pengguna dan maklumat kebenaran boleh dimasukkan dalam penggunaan lanjutan. 4. Kesilapan umum termasuk kegagalan pengesahan tandatangan, tamat tempoh, dan muatan besar. Kemahiran penyahpepijatan termasuk menggunakan alat debugging dan pembalakan. 5. Pengoptimuman prestasi dan amalan terbaik termasuk menggunakan algoritma tandatangan yang sesuai, menetapkan tempoh kesahihan dengan munasabah,

    Bagaimanakah sesi merampas kerja dan bagaimana anda dapat mengurangkannya dalam PHP? Bagaimanakah sesi merampas kerja dan bagaimana anda dapat mengurangkannya dalam PHP? Apr 06, 2025 am 12:02 AM

    Sesi rampasan boleh dicapai melalui langkah -langkah berikut: 1. Dapatkan ID Sesi, 2. Gunakan ID Sesi, 3. Simpan sesi aktif. Kaedah untuk mengelakkan rampasan sesi dalam PHP termasuk: 1. Gunakan fungsi Sesi_Regenerate_ID () untuk menjana semula ID Sesi, 2. Data sesi stor melalui pangkalan data, 3.

    Huraikan prinsip -prinsip yang kukuh dan bagaimana ia memohon kepada pembangunan PHP. Huraikan prinsip -prinsip yang kukuh dan bagaimana ia memohon kepada pembangunan PHP. Apr 03, 2025 am 12:04 AM

    Penerapan prinsip pepejal dalam pembangunan PHP termasuk: 1. Prinsip Tanggungjawab Tunggal (SRP): Setiap kelas bertanggungjawab untuk hanya satu fungsi. 2. Prinsip Terbuka dan Tutup (OCP): Perubahan dicapai melalui lanjutan dan bukannya pengubahsuaian. 3. Prinsip Penggantian Lisch (LSP): Subkelas boleh menggantikan kelas asas tanpa menjejaskan ketepatan program. 4. Prinsip Pengasingan Antara Muka (ISP): Gunakan antara muka halus untuk mengelakkan kebergantungan dan kaedah yang tidak digunakan. 5. Prinsip Inversi Ketergantungan (DIP): Modul peringkat tinggi dan rendah bergantung kepada abstraksi dan dilaksanakan melalui suntikan ketergantungan.

    Bagaimana cara menetapkan kebenaran secara automatik UnixSocket selepas sistem dimulakan semula? Bagaimana cara menetapkan kebenaran secara automatik UnixSocket selepas sistem dimulakan semula? Mar 31, 2025 pm 11:54 PM

    Bagaimana untuk menetapkan keizinan UnixSocket secara automatik selepas sistem dimulakan semula. Setiap kali sistem dimulakan semula, kita perlu melaksanakan perintah berikut untuk mengubahsuai keizinan UnixSocket: sudo ...

    Bagaimana cara debug mod CLI dalam phpstorm? Bagaimana cara debug mod CLI dalam phpstorm? Apr 01, 2025 pm 02:57 PM

    Bagaimana cara debug mod CLI dalam phpstorm? Semasa membangun dengan PHPStorm, kadang -kadang kita perlu debug PHP dalam mod Interface Line Command (CLI) ...

    Terangkan pengikatan statik lewat dalam php (statik: :). Terangkan pengikatan statik lewat dalam php (statik: :). Apr 03, 2025 am 12:04 AM

    Mengikat statik (statik: :) Melaksanakan pengikatan statik lewat (LSB) dalam PHP, yang membolehkan kelas panggilan dirujuk dalam konteks statik dan bukannya menentukan kelas. 1) Proses parsing dilakukan pada masa runtime, 2) Cari kelas panggilan dalam hubungan warisan, 3) ia boleh membawa overhead prestasi.

    Bagaimana cara menghantar permintaan pos yang mengandungi data JSON menggunakan perpustakaan php curl? Bagaimana cara menghantar permintaan pos yang mengandungi data JSON menggunakan perpustakaan php curl? Apr 01, 2025 pm 03:12 PM

    Menghantar data JSON menggunakan perpustakaan Curl PHP dalam pembangunan PHP, sering kali perlu berinteraksi dengan API luaran. Salah satu cara biasa ialah menggunakan perpustakaan curl untuk menghantar post ...

    See all articles