Un convertisseur PHP pour des balises personnalisées en HTML

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

16 janv. 2006, 17:07

Voici, une solution pour simplifier l'insertion des listes déroulantes et des tables HTML avec un contenu issu d'une source externe exactement comme c'est le cas des images, des frames, des iframe et autres.

L'idée est de pouvoir écrire les listes et tables comme suit:
1. Pour une liste : <Select src="data_list.txt" name= "list1" caption= "List 1">
2. Pour une table : <table src="data_table.txt" name= "table1" caption= "Table 1">

Exemple.htm :

Code : Tout sélectionner

<html> <form name="f" onSubmit="return validate();"> <p><SELECT id="js_id" src="mois.txt" name="mois" caption="Mois" onChange="f.submit();"> <p><TABLE src="agenda.txt" name= "agenda" caption= "Agenda" onClick="f.submit();"> </form> </html>
Pour transformer ces formats personnalisés en balises HTML, un convertisseur PHP est développé et se présente comme suit:

html_parser.php?file=exemple.htm
ce programme transforme le fichier HTML de base en fichier HTML/PHP prêt à l'emploi.
<?php
//Programme d'interprétation de balises HTML modifiées

//PRINCIPAL (exige un fichier HTML en entrée)
if (!$_GET[file]) {
	echo "<p>Aucun fichier à traiter!";
	exit;
};

//Les balises recherchées
$tags = array("SELECT", "TABLE");

//Traitement du fichier en entrée
$file = file_get_contents($_GET[file]);
$file = str_replace("\r\n", " ", $file);
foreach ($tags as $tag) $file = parse($file, $tag);

//Affichage en tantque fichier PHP
showAs_PHP($file);

//FONCTIONS
function showAs_PHP($file){
	$file = "<?php \n \t extract(\$_GET); \n \t echo \"".str_replace("\\'","'", addslashes($file))."\"; \n?>";
	file_put_contents("temp.php", $file);
	header("location: temp.php");
}

function parse($file, $tag){
	//Format :
	//<select src="data_list.txt" name="list1" caption="List 1">
	//<table src="data_table.txt" name="table1" caption="Table 1">
		
		//Recherche du tag
		preg_match("#<$tag\s+[^>]+>#", $file, $résultat);
		$ligne_origine = trim($résultat[0]);
		$ligne_recherche = str_replace("<$tag", "", str_replace(">", "", $ligne_origine));
		
		//Recherche de l'attribut src
		preg_match('#(src\s*=(\s|"|\')*[^"]*("|\')\s)#', $ligne_recherche, $résultat);
		$src = trim($résultat[0]);
		
		//Recherche de l'attribut name
		preg_match('#(name\s*=(\s|"|\')*[^"]*("|\')\s)#', $ligne_recherche, $résultat);
		$name = trim($résultat[0]);
		$clé = $name;
		
		//Recherche de l'attribut caption
		preg_match('#(caption\s*=(\s|"|\')*[^"]*("|\')\s)#', $ligne_recherche, $résultat);
		$caption = trim($résultat[0]);
		
		//Recherche des autres attributs
		$other_attrib = str_replace($src,"",str_replace($name, "", str_replace($caption, "", $ligne_recherche)));

		//Extraction des valeurs
		$src = trim(preg_replace('/(^src\s*=(\s|"|\')*)|("|\')$/', "", $src));
		$name = trim(preg_replace('/(^name\s*=(\s|"|\')*)|("|\')$/', "", $name));
		$caption = trim(preg_replace('/(^caption\s*=(\s|"|\')*)|("|\')$/', "", $caption));
				
		//Construction du HTML
		$html = write ($tag, $src, $name, $caption, $other_attrib);
		
		$file = str_replace($ligne_origine, $html, $file);
	
	return $file;
}

function write ($tag=null, $src=null, $name="", $caption="", $other_attrib=null){
if ($tag == null || $src == null) return null;

switch (strtoupper($tag)){
 
 case "SELECT":
	$résultat = "<b>$caption</b> <SELECT name=\"$name\" $other_attrib><OPTION value=\"\">-- Choisissez --</OPTION>"; 
    $options = @file($src); 
	if ($options) 
    	foreach ($options as $i=>$ligne){
		 $ligne = explode(",", $ligne);
		 if ($ligne[0]){
			$valeur = $ligne[0]&&$ligne[1]?$ligne[0]:$i;
			$texte = $ligne[0]&&$ligne[1]?$ligne[1]:$ligne[0];
			$résultat.= "<OPTION value=\"$valeur\">$texte</OPTION>"; 
		}
	}
	$résultat.= "</SELECT>
	<script>
		for (i=0; i<document.all[\"$name\"].options.length; i++){
			if (document.all[\"$name\"].options[i].value == \"$$name\"){
				document.all[\"$name\"].options[i].selected = true;
				break;
			}
		}
	</script>
	";
	return $résultat;

  case "TABLE":
	$résultat = "<TABLE border name=\"$name\" $other_attrib><LEGEND><b>$caption</b></LEGEND>"; 
    $contenu = @file($src); 
	if ($contenu) 
    	foreach ($contenu as $i=>$ligne){
		 
		 $ligne = explode(",", $ligne);
		 $résultat.= "<TR id=\"ligne_$i\" onClick=\"select(this);\">";
		 
		 foreach ($ligne as $j=>$col)
		 	if ($i == 0) $résultat.= "<TH>$col <input type=hidden name=\"$name"."["."$i][$j]\" value=\"$col\">";
		 	else $résultat.= "<TD>$col <input type=hidden name=\"$name"."["."$i][$j]\" value=\"$col\">";
		}
	$résultat.= "</TABLE><input type=hidden name=\"ligne\" value=\"\$ligne\">
	<script>
	  //Global
	  var id_last = \"\$ligne\";
	  var last_selected_in_$name = id_last?document.all[id_last]:null;
	  //Default: Select last
	  if (last_selected_in_$name){
	  	last_selected_in_$name.style.background = \"silver\";
	  	last_selected_in_$name.style.color = \"white\";
	  }

	  function select(me){
		//unSelect last selected
		if (last_selected_in_$name && last_selected_in_$name.style){
		 last_selected_in_$name.style.background = \"\";
		 last_selected_in_$name.style.color = \"\";
		}
		//Select me
		me.style.background = \"silver\";
		me.style.color = \"white\";
		//Store me as last selected
		last_selected_in_$name = me;
		document.all[\"ligne\"].value = me.id;
	  }
	</script>
	";
	return $résultat;
	
  default : return null;
}
}
?>
Extrait d'exemple des fichiers de données utilisés pour les source des lists et tables :

Le fichier "mois.txt" pour remplir la liste
  • 1,Janvier
    2,Février
    3,Mars
Le fichier "agenda.txt" pour remplir la table
  • Date,Heure,Durée,Note
    16-01-06,08:30,2,Préparer le cours PHP/HTML
    16-01-06,13:30,3,Cours PHP/HTML
    16-02-06,08:30,2,Préparer le cours PHP/HTML
    16-02-06,13:30,3,Cours PHP/HTML
Pour tester le convertisseur taper l'Url : html_parser.php?file=exemple.htm
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène