2014-05-06 5 views
1

Je pense que l'utilisation de regex pour trouver/remplacer est ma meilleure option pour cela .. mais je vais donner un aperçu de ce que je suis en train de faire au cas où il y a d'autres conseils/suggestionsregex + remplacer le caractère entre les balises en utilisant Notepad ++

  1. J'ai un appartement (statique) fichier .xml

  2. Je suis en train de convertir des choses plus d'utiliser une base de données au lieu de chargement de fichier .xml plat, (ce sera votre interface forme habituelle/GUI, qui soumet à une base de données MySQL en utilisant PHP/PDO (pas d'injections SQL ici mon pote!);) (Cela fonctionne déjà très bien)

  3. Je travaille actuellement sur l'obtention de ce 'back-log' des données du fichier plat .xml dans la base de données.

    a. J'ai essayé d'utiliser SQL LOAD XML INFILE: https://stackoverflow.com/questions/22775206/how-to-use-load-xml-infile-with-special-characters mais n'a pas pu comprendre comment analyser/échapper des données de caractères spéciaux ...

    b. Je suis maintenant passé à PHP/SimpleXML, mais je rencontre à nouveau des problèmes avec des caractères spéciaux dans certains nœuds/éléments du XML. (Peut-être des guillemets simples ou doubles, « & » signe, pas sûr .. son un champ « description »)

Lorsque je tente de charger le fichier XML .. J'obtiens une erreur:

Warning: simplexml_load_file() [function.simplexml-load-file]: xml_source.xml:142: parser error : Opening and ending tag mismatch: BR line 142 and description in C:\wamp\www\xml_tests\simpleXML_test.php on line 4

Si je trouve le nœud xml et remplace l'apostrophe par ', il va analyser et passer au nœud suivant qui a un caractère spécial qui le casse. Mon instinct était d'essayer et de trouver comment utiliser REGEX pour rechercher une apostrophe (ou n'importe quel caractère spécial d'ailleurs) entre deux étiquettes .... et faire un remplacement avant que les données soient entrées dans le DB.

Mais peut-être y a-t-il une meilleure façon d'analyser PHP/SimpleXML ... mais il semble que je doive m'en débarrasser avant que SimpleXML ne lise le fichier? Simple test, mais comme je l'ai mentionné, je reçois l'erreur ci-dessus avec les apostrophes encore là-bas.

Comment puis-je utiliser REGEX pour rechercher un caractère spécial (unique citation/apostrophe) qui est entre deux <tags> </tags>

Voici le REGEX j'ai essayé pour la partie RECHERCHE .. (Je ne peux pas semble clouer la partie remplacer remplace-t-elle le mot entier par l'apostrophe pour une raison quelconque?)

Recherche: (Notepad ++)

[?=<description>].'[?=</description>] 

Remplacer:

\&apos; 

exemple de XML:

<?xml version="1.0" encoding="UTF-8"?> 
<entries> 
    <entry submissionDate="2013-02-18"> 
     <fontName>String/Text</fontName>  
     <fontCreator>String/Text</fontCreator> 
     <fontFormat>String/Text</fontFormat> 
     <optimized>String/Text</optimized> 
     <fontPrice>Nuumber/Int (with decimal)</fontPrice> 
     <fontImage>String/Text</fontImage> 
     <fontURL>Int</fontURL> 
     <description>Don't can't lot's of 'single' quote/apostrophes and "double quotes" too</description> 
     <piracyVid>String/Text</piracyVid> 
     <demoLink>String/Text</demoLink> 
    </entry> 

    <entry submissionDate="2013-02-18"> 
     <fontName>String/Text</fontName>  
     <fontCreator>String/Text</fontCreator> 
     <fontFormat>String/Text</fontFormat> 
     <optimized>String/Text</optimized> 
     <fontPrice>Nuumber/Int (with decimal)</fontPrice> 
     <fontImage>String/Text</fontImage> 
     <fontURL>Int</fontURL> 
     <description>Don't can't lot's of 'single' quote/apostrophes and "double quotes" too</description> 
     <piracyVid>String/Text</piracyVid> 
     <demoLink>String/Text</demoLink> 
    </entry> 
</entries> 

Merci

+0

Sons comme votre XML est tout simplement invalide. Ne devriez-vous pas résoudre ce problème? Il n'y a rien de mal avec de simples apostrophes. Pouvez-vous poster un exemple du fichier XML? – Phil

+1

Je suis d'accord avec Phil en ce qui concerne XML cassé et nécessitant un exemple, comme vous pouvez le voir [ici] (http://en.wikipedia.org/wiki/XML#Escaping) les caractères spécifiques doivent être échappés. Êtes-vous capable de revenir en arrière et de réparer tout ce qui génère le fichier xml? –

+0

merci pour les réponses. Oui, c'est ce que j'essaie de faire, 'réparer' le XML avant de l'analyser avec PHP/SimpleXML. (D'où la question de regex pour remplacer les guillemets simples/apostrophes) Comme mentionné il s'agit d'un fichier FLAT .xml. Ouvrez-le dans n'importe quel éditeur ajouter un nouveau noeud/élément enregistrer) .. ne m'importe si je m'échappe alors ou les remplacer .. (Je ne peux pas obtenir l'regex au travail) Je ne sais pas pourquoi cela aidera. ..mais ici est un extrait de la mise en page XML: – whispers

Répondre

0

Avec SimpleXML, il est aussi simple que:

foreach($xml->xpath('//entry/description') as $node) { 
    $node[0] = preg_replace('/"/u', '(say it sam: \0)', $node); 
} 

$xml->asXML('php://output'); 

Ce qui donne à votre exemple:

<?xml version="1.0" encoding="UTF-8"?> 
<entries> 
    <entry submissionDate="2013-02-18"> 
     <fontName>String/Text</fontName> 
     <fontCreator>String/Text</fontCreator> 
     <fontFormat>String/Text</fontFormat> 
     <optimized>String/Text</optimized> 
     <fontPrice>Nuumber/Int (with decimal)</fontPrice> 
     <fontImage>String/Text</fontImage> 
     <fontURL>Int</fontURL> 
     <description>Don't can't lot's of 'single' quote/apostrophes and (say it sam: ")double quotes(say it sam: ") too</description> 
     <piracyVid>String/Text</piracyVid> 
     <demoLink>String/Text</demoLink> 
    </entry> 

    <entry submissionDate="2013-02-18"> 
     <fontName>String/Text</fontName> 
     <fontCreator>String/Text</fontCreator> 
     <fontFormat>String/Text</fontFormat> 
     <optimized>String/Text</optimized> 
     <fontPrice>Nuumber/Int (with decimal)</fontPrice> 
     <fontImage>String/Text</fontImage> 
     <fontURL>Int</fontURL> 
     <description>Don't can't lot's of 'single' quote/apostrophes and (say it sam: ")double quotes(say it sam: ") too</description> 
     <piracyVid>String/Text</piracyVid> 
     <demoLink>String/Text</demoLink> 
    </entry> 
</entries> 
Questions connexes