2008-12-30 15 views
1

J'ai un projet sur lequel je travaille à la conversion de certaines anciennes formes perl cgi en PHP. Beaucoup de ceci exige de trouver/remplacer l'information. Dans un tel cas, j'ai des lignes comme dans le script perl:Textmate Regex Rechercher Remplacer Aide

<INPUT type="radio" name="trade" value="1" $checked{trade}->{1}> 

qui doit lire:

<INPUT type="radio" name="trade" value="1" <?php echo checked('trade', 1); ?>> 

Un autre exemple pour montrer une certaine variation dans la façon dont ces balises pourraient apparaître dans le perl/html:

<INPUT type="radio" name="loantype" value="new" $checked{loantype}->{new}> 
<INPUT type="radio" name="loantype" value="new" $checked{'loantype'}->{new}> 
<INPUT type="radio" name="loantype" value="new" $checked{'loantype'}->{'new'}> 
<INPUT type="radio" name="loantype" value="new" $checked{loantype}->{'new'}> 

Comme vous pouvez le voir, les guillemets peuvent être n'importe où, mais ce n'est pas mon problème. J'ai décidé d'écrire une regex de recherche/remplacement dans textmate pour rendre ma vie un peu plus facile. Mon Regex ressemble:

Find:  \$checked\{'?([^']+)'?\}->\{'?([^']+)'?\} 
Replace: <?php echo checked('$1', '$2'); ?> 

Cela a bien fonctionné dans le premier dossier que je l'ai fait avec, mais pour une raison quelconque dans le fichier actuel est devenu le Regex vraiment gourmand, correspondant à de nombreuses lignes. cela correspondra au début (\ $ checked ...), puis correspondra à la dernière fois que le caractère '}' apparaîtra. J'ai essayé quelques variantes pour le rendre un peu moins gourmand dont:

^(.*)\$checked\{'?([^']+)'?\}->\{'?([^']+)'?\}(.*)$ 

Mais même cela semble correspondre à plusieurs lignes. Je supposais que le^au début ne ferait que correspondre au début d'une ligne, et le $ à la fin ne correspondrait qu'à la fin ... contraindre ma correspondance à 1 ligne ... mais ce n'est pas le cas.

/me manque à regex

Merci pour toute aide, Mike

Répondre

2

Essayez ceci:

^(.*?)\$checked\{'?([^']+?)'?\}->\{'?([^']+?)'?\}(.*?)$ 

Le ? après * et + les rendre "non gourmand".

+0

Merci, cela fonctionne parfaitement. –