2013-06-09 8 views
0

Je dois modifier les zones d'un modèle et produire un fichier .htaccess. Voici une partie du modèle pour le fichier .htaccess. Les [NPAC_TMP:~core_dir] sont les pièces qui se remplacent:Regex ne correspond pas comme prévu

RewriteCond %{REQUEST_URI} !^[NPAC_TMP:~core_dir]/ 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ [NPAC_TMP:~core_dir]/$1 
RewriteCond %{HTTP_HOST} ^(www.)?localhost:8888$ 
RewriteRule ^(/)?$ [NPAC_TMP:~core_dir]/index.php [L] ###DEFECTIVE LINE 

Ruby Script:

template_tag = line.match(/\[NPAC_TMP:~(.*)\]/).to_s 
param  = template_tag.split("~")[1][0..-2] 

if(param == "core_dir") 
    line[template_tag]= CONFIG[:core_dir] 
    temp_file.puts line 
end 

Lorsque le script est exécuté, tous les obtenir correctement remis en place, sauf le dernier:

RewriteCond %{REQUEST_URI} !^core/ 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ core/$1 
RewriteCond %{HTTP_HOST} ^(www.)?localhost:8888$ 
RewriteRule ^(/)?$ [NPAC_TMP:~core_dir]/index.php [L] ###DEFECTIVE LINE 

Ce n'est pas le seul fichier de modèle dans lequel cette méthode s'exécute, et dans tous les autres fichiers, il fonctionne correctement où tous les éléments sont remplacés.

Aux fins de dépannage, j'ai copié le RewriteCond %{REQUEST_URI} !^[NPAC_TMP:~core_dir]/" et l'ai placé directement sous la ligne défectueuse. Cet élément ajouté a été mis à jour correctement, mais pas celui qui le précède.

Je puis placé une copie de la ligne défectueuse directement en dessous ainsi et a reçu deux lignes défectueuses, ce qui me porte à croire que ses quelque chose de la manière que cette chaîne complète est structurée qui jette le REGEX off: RewriteRule ^(/)?$ [NPAC_TMP:~core_dir]/index.php [L]

Toute aide serait grandement appréciée. Aussi, si vous avez des suggestions sur la façon de raccourcir ou d'améliorer la partie Ruby du script, je suis tout ouïe.

+1

Si vous voulez ce qui se passe entre le '~' et le ']', vous pouvez juste utiliser 'line.match (/../) [1]' au lieu de '.to_s', pour obtenir ce qui est entre parenthèses dans votre regex - le premier "groupe" ('String # match' renvoie un objet [MatchData] (http://www.ruby-doc.org/core-2.0/MatchData.html) qui vous donne tous les groupes de votre match). Ensuite, vous n'avez pas à vous tromper avec des trucs «split» et épissures de cordes. –

+0

Grand appel. Je vous remercie. – voodooGQ

+0

np :) J'essaie d'éviter autant que possible de manipuler des cordes à un niveau aussi bas que possible et je pense que dans la plupart des langues où ce n'est pas obligatoire, c'est une bonne pratique générale. c'est plus facile à maintenir et plus facile à comprendre pour les autres lecteurs. –

Répondre

1

Le .* dans votre regex \[NPAC_TMP:~(.*)\] est gourmand (il correspond autant que possible), de sorte qu'il corresponde

[NPAC_TMP:~core_dir]/index.php [L] 

qui vous donne le groupe

core_dir]/index.php [L 

voir http://rubular.com/r/NbZxd5prdT

Vous devez utiliser [^]]* (ou [^]]+ au lieu de .*

voir http://rubular.com/r/h0YcyWfvgu

La prochaine fois si vous avez un problème regex une bonne façon de faire est d'imprimer/tracer vos correspondances afin que vous puissiez voir exactement ce que vous êtes correspondant.

Je ne fais que "développer"/écrire mes regexes au rubular pour m'assurer qu'elles fonctionnent comme je le souhaite.

+0

Amélioration de la réponse que j'ai trouvée. Juste pour augmenter mes connaissances, est-ce qu'il y aurait un cas où l'utilisation de '[^]] * serait plus précise que l'utilisation de' [^]] '? Ou plus vite/mieux ect? – voodooGQ

+0

(Je voulais dire '[^]] +') Je ne suis pas sûr de ce qui est le mieux en termes de performances, il semble que vous n'attendiez pas vraiment que le cas '[]' corresponde. –

+1

Aussi, je ne vois aucune raison pour laquelle vous ne pourriez pas simplement modifier votre expression rationnelle originale pour inclure '~ core_dir' et juste faire une simple' String # gsub' –

2

oublié de rendre le groupe non gourmand:

template_tag = line.match(/\[NPAC_TMP:~(.*)\]/).to_s 

devrait être:

template_tag = line.match(/\[NPAC_TMP:~(.*?)\]/).to_s 

Résolu la question, correspond à tous les cas maintenant.

+1

Le terme n'est pas "paresseux", c'est "pas-gourmand". –

+0

Mise à jour verbiage – voodooGQ