2 votes

Convertir du texte formaté HTML en texte normal dans ColdFusion 9

Une application se compose de Flex comme frontal, ColdFusion 9 comme niveau intermédiaire et MySQL 5 comme back-end.

Une table MySQL contient certains champs qui contiennent un formatage HTML. Ainsi, si un champ a la chaîne de valeur "Test Record", il est stocké en tant que <TEXTFORMAT LEADING="2"><P ALIGN="LEFT"><FONT FACE="Arial" SIZE="12" COLOR="#0B333C" LETTERSPACING="0" KERNING="0">Test Record<FONT SIZE="8"></FONT></FONT></P></TEXTFORMAT> dans la table MySQL

Maintenant, la valeur de ce champ est imprimée dans un document PDF sous la forme suivante

<cfdocument format="pdf" filename="#report_filename_format#" orientation="landscape"
overwrite="yes"
marginbottom="0" marginleft="0" marginright="0" margintop="0"
pagetype="legal">

<tr>
<td width="20%" style="background-color:##CCCCCC; font-weight:bold; text-transform:uppercase; vertical-align:top;">
Value
</td>
<td width="80%">#printrecord.field_value#</td>
</tr>

Puisque la valeur du champ est stockée avec le formatage HTML, l'espace occupé est plus grand et il n'y a pas de contrôle sur la valeur du champ. contrôle sur le type et la taille de la police du texte imprimé.

  1. Existe-t-il une fonction dans ColdFusion 9 qui permette de convertir la valeur du champ en un texte normal (sans le formatage HTML) de sorte que si "Test Record" s'imprime de la même manière, qu'il soit stocké en taille de police 10 ou 30 ?

  2. Je pense à un moyen de faire en sorte que l'enregistrement soit imprimé dans une application Flex, en utilisant la propriété field.text d'un contrôle TextArea (en Flex) pour le convertir en texte normal, puis transmettre la valeur convertie à ColdFusion pour qu'elle soit imprimée dans le document PDF. Existe-t-il d'autres meilleures options ?

Toute suggestion serait appréciée.

1voto

AlexP Points 9284

En fait, la "solution" est assez simple :

<cfscript>
  data   = '<TEXTFORMAT LEADING="2"><P ALIGN="LEFT"><FONT FACE="Arial" SIZE="12" COLOR="##0B333C" LETTERSPACING="0" KERNING="0">Test Record<FONT SIZE="8"></FONT></FONT></P></TEXTFORMAT>';
  regex  = "<(.|\n)*?>";
  result = reReplaceNoCase(data, regex, "", "all");

  writeOutput(result);
</cfscript>

J'ai ajouté une balise de hachage au HTML de mon exemple pour éviter les erreurs de syntaxe. D'après ce que vous avez dit, je suppose que ces données seront de toute façon récupérées par une requête de la base de données.

De plus, je vous suggère de mettre à jour la base de données avec les nouvelles valeurs et de remplacer le style en ligne par un style CSS si possible.

1voto

Peter Boughton Points 49510

Une autre façon de procéder est d'utiliser un analyseur HTML comme jsoup .

Cela est particulièrement recommandé si le HTML est imprévisible ou risque de ne pas être valide, car il le traitera de la même manière qu'un navigateur (alors qu'une regex est simplement une correspondance de motifs ; elle ne sait pas réellement ce qui est/n'est pas une balise).

<cfset data = '<TEXTFORMAT LEADING="2"><P ALIGN="LEFT"><FONT FACE="Arial" SIZE="12" COLOR="##0B333C" LETTERSPACING="0" KERNING="0">Test Record<FONT SIZE="8"></FONT></FONT></P></TEXTFORMAT>' />

<cfset jsoup = createObject('java','org.jsoup.Jsoup') />

<cfset text = jsoup.parse(data).text() />

<cfdump var=#text# />

La ligne jsoup peut être exécutée une fois et stockée, par exemple, dans la portée de l'application. De plus, vous avez besoin du jar jsoup pour que cela fonctionne - pour CF9, vous devrez le copier dans votre répertoire {coldfusion}/lib puis redémarrer le serveur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X