Aide Textmate Regex Rechercher sur le remplacement
Question
J'ai un projet sur lequel je travaille sur la conversion de certaines formes héritées de perl cgi en PHP. Cela nécessite en grande partie de rechercher / remplacer des informations. Dans un cas, j'ai des lignes comme celle-ci dans le script Perl:
<INPUT type="radio" name="trade" value="1" $checked{trade}->{1}>
qui doit être lu:
<INPUT type="radio" name="trade" value="1" <?php echo checked('trade', 1); ?>>
Voici un autre exemple montrant comment ces balises pourraient apparaître dans le fichier 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 constater, les citations peuvent être n'importe où, mais ce n’est pas mon problème. J'ai décidé d'écrire un regex find / replace dans textmate pour me rendre la vie un peu plus facile. Mon regex ressemble à:
Find: \$checked\{'?([^']+)'?\}->\{'?([^']+)'?\}
Replace: <?php echo checked('$1', '$2'); ?>
Cela a bien fonctionné dans le premier fichier avec lequel je l’ai fait, mais pour une raison quelconque, dans le fichier actuel, la Regex est devenue vraiment gourmande, correspondant à de nombreuses lignes. cela correspondra au début (\ $ vérifié ...) et ensuite à la dernière fois que le caractère '}' sera apparu. J'ai essayé quelques variantes pour le rendre un peu moins gourmand, notamment:
^(.*)\$checked\{'?([^']+)'?\}->\{'?([^']+)'?\}(.*)$
Mais même cela semble correspondre à plusieurs lignes. J'ai supposé que ^ au début ne correspondrait qu'au début d'une ligne, et le $ à la fin ne correspondait qu'à la fin ... contraignant ma correspondance à 1 ligne ... mais ça ne semble pas.
/ moi échoue à l'expression régulière
Merci pour toute aide, Mike
La solution
Essayez ceci:
^(.*?)\$checked\{'?([^']+?)'?\}->\{'?([^']+?)'?\}(.*?)$
Les ?
après *
et +
les rendent "non gourmands".