Donc, j'écris un script Perl rapide qui nettoie un code HTML et l'exécute via un programme HTML -> PDF. Je veux perdre aussi peu d'informations que possible, je voudrais donc étendre mon TexareAs pour correspondre à tout le texte qui y est actuellement. Cela signifie, dans mon cas, définissant le nombre de lignes à une valeur calculée en fonction de la valeur de la chaîne dans la zone de texte.
Ceci est actuellement la regex que j'utilise P>
$file=~s/<textarea rows="(.+?)"(.*?)>(.*?)<\/textarea>/<textarea rows="(?{ length($3)/80 })"$2>$3<\/textarea>/gis;
6 Réponses :
Je crois que votre problème est un si ce n'est pas le problème, c'est certainement un problème. P> Essayez cela, notez le Le motif de base de ce code est le suivant: p> " / Code> sont des options, que je devrais rechercher. Je pense que g = global, i = cas insensible, S = rien ne vient à l'esprit en ce moment. P> p> non évalué code> \ / 80 code> p>
Doit cela être fait avec regex? Pour analyser toute langue de balise (ou même CSV) avec regex d'une erreur d'erreur. Si vous le pouvez, essayez d'utiliser une bibliothèque standard: p>
http://search.cpan.org/dist/html-parser /Parser.pm p>
Sinon, vous risquez la vengeance de Cthulu: P>
http: //www.codinghorrorror .com / blog / 2009/11 / analyse-html-the-cthulhu-way.html p>
(Oui, l'article quitte la place pour une simple manipulation à la chaîne, alors je pense que votre âme est en sécurité, cependant.: -) p>
Le (? {...}) Code> Modèle est une fonctionnalité expérimentale pour exécuter le code du côté correspondant, mais que vous souhaitez exécuter du code sur le côté em> remplaçable. Utilisez le commutateur / E CODE> Expression régulière pour que: <textarea rows="1" bar="baz">howdy</textarea>
Mais votre exemple n'utilise pas l'option / e code> que vous avez mentionnée; De plus, c'est un script Perl à part entière au lieu d'une doublure pour le remplacement.
@ Hi-ange oui, il utilise l'option / E ... L'EGIS se tourne sur les drapeaux E, G, I et S. Et l'OP n'a pas demandé un one-liner ... Greg fournissait un script Perl complet lisible pouvant être exécuté ... Il aurait pu compresser le match correspondant à une ligne comme dans l'original, mais cela le ferait inutilement difficile à comprendre.
La syntaxe que vous utilisez pour incorporer le code n'est valable que dans la partie "Match" de la substitution (côté gauche). Pour intégrer le code dans le côté droit (qui est une chaîne normale de Perl Double cité), vous pouvez le faire:
$file =~ s{<textarea rows="(.+?)"(.*?)>(.*?)</textarea>}
{'<textarea rows="' . (length($3)/80) . qq{"$2>$3</textarea>}}gise;
Pourriez-vous élaborer un peu sur votre @ {[pérl_code]} code> idiome? Lorsque j'essaie d'exécuter un @ {[Imprimer ("Bonjour")]} code> du côté de remplacement, je ne reçois pas le mot "bonjour" en place.
Premièrement, vous devez citer le Ensuite, vous arrivez au problème principal, c'est-à-dire que à la place, il y a le modificateur / la personne verra Sinon, le PERL verra SA /// Opérateur suivi du numéro 80 code> et ainsi de suite ). Ou vous pouvez utiliser un délimiteur différent; Pour les substitutions complexes, les crochets correspondants sont une bonne idée. (? {...}) code> est uniquement disponible dans les modèles. Le texte de remplacement n'est pas un motif, c'est (presque) une chaîne ordinaire. P> E code> sur le s /// code> opérateur, qui vous permet d'écrire une expression de remplacement plutôt que de la chaîne de remplacement. p>
Selon http://perldoc.perl.org/perlrequick.html # Recherche-and-remplacer , cela peut être accompli avec le modificateur d'évaluation " Le modificateur d'évaluation S /// E enveloppe une évaluation {...} autour de la chaîne de remplacement et le résultat évalué est substitué à la sous-chaîne correspondante. Quelques exemples: P>
s /// e code> em>", par exemple, vous gis code> doit avoir un EX code> dedans.
# convert percentage to decimal
$x = "A 39% hit rate";
$x =~ s!(\d+)%!$1/100!e; # $x contains "A 0.39 hit rate"