9
votes

Evaluations d'intégration dans Perl Regex

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;


0 commentaires

6 Réponses :


0
votes

Je crois que votre problème est un non évalué

si ce n'est pas le problème, c'est certainement un problème.

Essayez cela, notez le \ / 80 xxx

Le motif de base de ce code est le suivant: xxx

" / 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.


0 commentaires

1
votes

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:

http://search.cpan.org/dist/html-parser /Parser.pm

Sinon, vous risquez la vengeance de Cthulu:

http: //www.codinghorrorror .com / blog / 2009/11 / analyse-html-the-cthulhu-way.html

(Oui, l'article quitte la place pour une simple manipulation à la chaîne, alors je pense que votre âme est en sécurité, cependant.: -)


0 commentaires

12
votes

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>


2 commentaires

Mais votre exemple n'utilise pas l'option / e 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.



6
votes

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;


1 commentaires

Pourriez-vous élaborer un peu sur votre @ {[pérl_code]} idiome? Lorsque j'essaie d'exécuter un @ {[Imprimer ("Bonjour")]} du côté de remplacement, je ne reçois pas le mot "bonjour" en place.



0
votes

Premièrement, vous devez citer le / 80 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.

Ensuite, vous arrivez au problème principal, c'est-à-dire que (? {...}) est uniquement disponible dans les modèles. Le texte de remplacement n'est pas un motif, c'est (presque) une chaîne ordinaire.

à la place, il y a le modificateur E sur le s /// opérateur, qui vous permet d'écrire une expression de remplacement plutôt que de la chaîne de remplacement. xxx


0 commentaires

0
votes

Selon http://perldoc.perl.org/perlrequick.html # Recherche-and-remplacer , cela peut être accompli avec le modificateur d'évaluation " s /// e code> em>", par exemple, vous gis code> doit avoir un EX code> dedans.

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>

# convert percentage to decimal
$x = "A 39% hit rate";
$x =~ s!(\d+)%!$1/100!e;       # $x contains "A 0.39 hit rate"


0 commentaires