2012-06-08 2 views
0

Je dois envelopper toutes les instances de %{ ... %} avec <span code='notranslate'>...</span> SAUF SI le %{ ... } apparaît dans une balise HTML. Par exemple, ceci:Ruby Regex pour remplacer toutes les occurrences SAUF si un attribut HTML

"Or %{register_text} for a new account by <a href='%{path}'>clicking here</a>." 

doit devenir ce

"Or <span code='notranslate'>%{register_text}</span> for a new account by <a href='%{path}'>clicking here</a>." 

mon regex actuel ne prend pas en compte la situation de balise HTML:

x.gsub(/[?<!]%\{([a-zA-Z0-9_\-]*)\}[?>!]/i) {|s| "<span class='notranslate'>#{s}</span>"} 

donc je me demande comment Faites ceci en Ruby avec regex.

Tout preneur?

+0

Y at-il du javascript dans la chaîne d'entrée? Je veux dire JS intégré spécifiquement. – nhahtdh

+2

Vous pourriez être mieux avec une expression xpath qu'une regex. –

Répondre

0

Je ne suis pas sûr de l'espace d'entrée, donc c'est le meilleur que je peux trouver. Je nettoie aussi la regex un peu en cours de route.

/%\{[\w-]+\}(?![^<>]>)/ 

Pour un HTML bien formé, il ne correspond qu'aux jetons qui sont en dehors de la balise. Si le code HTML est mal formé, je ne pense pas que je suis à la hauteur pour écrire l'expression régulière.

Je suppose également qu'il n'y a aucun Javascript incorporé dans la page, puisque > et < dans Javascript n'est pas échappé.

+0

Ok - J'ai dû faire une petite modification pour échapper au {}: '/ \% {([\ w -] *) \} (?! [^ <>] *>) /' Mais je suis bizarre * * warning: regexp a un message d'intervalle ** invalide dans ruby. Des pensées? – JoshL

+0

Est-ce nécessaire? Cela fonctionne bien sur les rubriques, cependant. Le message invalide est probablement dû au '-', pouvez-vous essayer d'échapper' '-'? – nhahtdh

+0

Le trait d'union dans '[\ w-]' est correct. "Intervalle" fait probablement référence à un quantificateur "{min, max}". J'échapperais les deux accolades: '% \ {([\ w -] *) \}' - ou au moins la première: '% \ {([\ w -] *)}' –

Questions connexes