2010-10-27 5 views
1

je besoin d'une expression régulière qui échappe ou captures (si pas déjà échappé) TOUS les caractères sont tronqués INSIDE une seule chaîne cité, puis convertir les guillemets simples d'ouverture à double citation!expression régulière pour échapper à des guillemets doubles entre guillemets simples

Nous sommes en train de refactoriser des fichiers qui ont beaucoup (et je dis beaucoup!) De chaînes de guillemets simples dans les fichiers PHP et JS. La seule chose qu'ils ont en commun est que les chaînes sont au moins dans une ligne et sont concédées avec = dans les deux langues.

Je donne un exemple (l'exemple est le code existant laid donc ne juger s'il vous plaît, je l'ai déjà fait ce :)) Nous avons un fichier qui commence comme ceci:

var baseUrl = $("#baseurl").html(); 
var head = '<div id="finishingDiv" style="background-image:url({baseUrl}css/userAd/images/out_main.jpg); background-repeat: repeat-y; ">'+ 
'<div id="buttonbar" style="width:810px; text-align:right">'; 

et je veux il ressemble à ceci:

var baseUrl = $("#baseurl").html(); 
var head = "<div id=\"finishingDiv\" style=\"background-image:url({baseUrl}css/userAd/images/out_main.jpg); background-repeat: repeat-y; \">" + 
"<div id=\"buttonbar\" style=\"width:810px; text-align:right\">"; 

Comme vous le voyez les chaînes doubles de citation correctes ne sont pas touchées.

Ma question de base. Comment capturer tous les caractères d'un genre (dans mon cas, le caractère ") entre un certain début et le caractère de fin (dans mon cas, le caractère ')

Ce regex '.*(").*' ou '[^']*(")[^']*' capture juste toujours un "pour moi par match. Si le besoin de plus d'un pas est également acceptable, cela devrait fonctionner. Je serais heureux de toute solution, spécifique à l'IDE, spécifique à la langue ou à la coque, qui fonctionne efficacement.

S'il vous plaît aider, im désespérée, merci beaucoup

Répondre

1

Le plus gros problème sera de savoir où sont toutes les chaînes, car vous ne pouvez pas analyser tout JS ou PHP avec une regex Cependant, si je suppose que vous ne vous souciez pas des commentaires, ce code Ruby va attraper la plupart des cas (mais vous devriez revoir sa sortie):

#!/usr/bin/ruby -p 

gsub!(/'((?:[^\\']|\\[\\'])+)'/) do |m| 
    %Q{"#{$1.gsub("\\'","'").gsub(/\\[^\\]/) { "\\#{$0}" }.gsub('"','\\"')}"} 
end 

Ce code prend tout ce qui est présenté sur stdin/le contenu des arguments de fichiers, trouve une chaîne unique entre guillemets (en tenant compte de la présence éventuelle de \\ et \'), puis, pour son remplacement, exécute une série des substitutions dans la chaîne appariée (antislash assainissant, etc.). Le résultat est imprimé sur stdout. Si vous voulez une approche plus automatisée, remplacez la première ligne par #!/usr/bin/ruby -pi.bak; ensuite, quels que soient les arguments de fichier présentés, la substitution s'exécute sur eux de manière destructive sur place. Les anciens fichiers sont conservés avec une extension supplémentaire .bak.

Pour exécuter ce code, si vous n'avez jamais utilisé Ruby auparavant: enregistrez-le comme fix-sq.rb; exécuter chmod +x fix-sq.rb; puis exécutez ./fix-sq.rb file1 file2 file3.

+0

Merci travaillé presque comme je voulais :) – Tschef

0

Ce regex une seule capture "parce que vous êtes seulement demander un. Si vous voulez capturer toutes les citations, vous avez besoin quelque chose de plus comme (".*)+ au milieu Cela dit, "Capturez un ou plusieurs de ce modèle: une double citation suivie de zéro ou plus de tous les caractères."

+0

'. * (". *) +. *' Ne livre pas ce que je veux, capture d'autres caractères par match après le", mais ne reçoit plus de correspondances :( – Tschef

Questions connexes