2010-02-22 12 views
0

notre client nous a fourni des données XML qui doivent être traitées en utilisant PHP. Ils ont choisi d'abuser des attributs en les utilisant pour de gros morceaux de texte (contenant des sauts de ligne). L'analyseur XML remplace les sauts de ligne par des espaces pour rendre le XML W3 compatible. Pour éviter de perdre les sauts de ligne, je souhaite lire le fichier sous forme de chaîne, puis traduire toutes les sauts de ligne entre guillemets avec 
. Je pense que j'ai besoin d'une expression régulière pour cela, mais j'ai du mal à en trouver un.Expression régulière PHP nécessaire pour remplacer les sauts de ligne, mais seulement entre guillemets

Ceci est mon code de test (PHP 5) jusqu'à présent, à l'aide d'un look-ahead et regarder en arrière, mais il ne fonctionne pas:

$xml = '<tag attribute="Header\r\rFirst paragraph.">\r</tag>'; 
$pattern = '/(?<=")([^"]+?)\r([^"]+?)(?=")/'; 

print_r(preg_replace($pattern, "$1&#13;$2", $xml)); 

Quelqu'un peut-il me aider à obtenir ce droit? Devrait être facile pour un maître regexp chevronné :)

Répondre

1

La meilleure méthode serait de chercher caractère par caractère à la place. Définissez un booléen sur true si vous rencontrez un guillemet, puis sur false lorsque vous trouvez le guillemet correspondant.

Si vous trouvez un nouveau caractère de ligne, si vous êtes à l'intérieur des guillemets (c'est-à-dire que votre variable est vraie), alors "traduisez par &#13;" ce que vous voulez dire par là. Sinon, laissez-le tranquille.

1

Exactement, c'est ce que j'ai fini avec. Pour référence ultérieure, je posterai le code de travail ici:

<?php 
    header("Content-Type: text/plain"); 

    $xml = '<tag attribute="Header\r\rFirst paragraph.">\r</tag>'; 

    // split the contents at the quotes 
    $array = preg_split('/["]+/', $xml); 

    // replace new lines in each of the odd strings parts 
    for($i=1;$i<count($array);$i+=2){ 
     $array[$i] = str_replace('\n\r','&#13;',$array[$i]); 
     $array[$i] = str_replace('\r\n','&#13;',$array[$i]); 
     $array[$i] = str_replace('\r','&#13;',$array[$i]); 
     $array[$i] = str_replace('\n','&#13;',$array[$i]); 
    } 

    // reconstruct the original string 
    $xml = implode('"', $array); 

    print_r($xml); 
?> 

Merci pour la réponse et le soutien de cette solution :)

+0

Peut-être qu'il suffirait de remplacer simplement * une ligne * vous casse rencontre avec ' '? Je veux dire, les nouvelles lignes sont (devraient être) insignifiantes en XML, donc vous pouvez remplacer celles entre les balises sans rien casser. N'oubliez pas de remplacer également les caractères TAB. – Tomalak