


PHP implémente des fonctions de détection et de complétion pour les balises de fin dans les balises HTML
Cet article présente principalement la fonction de détection et de complétion PHP pour la balise de fin dans la balise HTML. Les amis intéressés peuvent s'y référer. J'espère qu'il sera utile à tout le monde. ,
L'exemple de cet article décrit comment implémenter la détection et la réparation de fermeture de balise html en PHP. Les détails sont les suivants :
Détection et réparation de fermeture de balise html, ce qui est un peu gros, et n'a pas été entièrement pris en compte. L'utilisation d'expressions régulières convient aux situations où il n'y a qu'une balise de début mais pas de balise de fin dans le fichier html, ou il y a une balise de fin mais pas de balise de début. La position de fermeture de l'étiquette doit être ajustée en fonction des besoins
<?php $str = ' <p data="<li></li>"> <img src="http://www.baidu.com/123123.png"/> <p2> <a>content</a> </p2> <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 <p3> </p3> </p4> </p> </p> <p6 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"; // } ?>
Résumé : Ce qui précède est l'intégralité du contenu de cet article, j'espère qu'il sera utile à l'apprentissage de chacun .
Recommandations associées :
Implémentation PHP de la conversion d'images en codes ASCII
Obtenir des caractères chinois dans le programme PHP Comment utiliser la première lettre du Pinyin
PHP+Mysql+jQuery pour compter le nombre d'utilisateurs en ligne actuels
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

PHP 8.4 apporte plusieurs nouvelles fonctionnalités, améliorations de sécurité et de performances avec une bonne quantité de dépréciations et de suppressions de fonctionnalités. Ce guide explique comment installer PHP 8.4 ou mettre à niveau vers PHP 8.4 sur Ubuntu, Debian ou leurs dérivés. Bien qu'il soit possible de compiler PHP à partir des sources, son installation à partir d'un référentiel APT comme expliqué ci-dessous est souvent plus rapide et plus sécurisée car ces référentiels fourniront les dernières corrections de bogues et mises à jour de sécurité à l'avenir.

Pour travailler avec la date et l'heure dans cakephp4, nous allons utiliser la classe FrozenTime disponible.

CakePHP est un framework open source pour PHP. Il vise à faciliter grandement le développement, le déploiement et la maintenance d'applications. CakePHP est basé sur une architecture de type MVC à la fois puissante et facile à appréhender. Modèles, vues et contrôleurs gu

Pour travailler sur le téléchargement de fichiers, nous allons utiliser l'assistant de formulaire. Voici un exemple de téléchargement de fichiers.

Le validateur peut être créé en ajoutant les deux lignes suivantes dans le contrôleur.

Se connecter à CakePHP est une tâche très simple. Il vous suffit d'utiliser une seule fonction. Vous pouvez enregistrer les erreurs, les exceptions, les activités des utilisateurs, les actions entreprises par les utilisateurs, pour tout processus en arrière-plan comme cronjob. La journalisation des données dans CakePHP est facile. La fonction log() est fournie

Visual Studio Code, également connu sous le nom de VS Code, est un éditeur de code source gratuit – ou environnement de développement intégré (IDE) – disponible pour tous les principaux systèmes d'exploitation. Avec une large collection d'extensions pour de nombreux langages de programmation, VS Code peut être c

CakePHP est un framework MVC open source. Cela facilite grandement le développement, le déploiement et la maintenance des applications. CakePHP dispose d'un certain nombre de bibliothèques pour réduire la surcharge des tâches les plus courantes.
