[Perl] expression rationelle

expression rationelle [Perl] - Programmation

Marsh Posté le 30-05-2001 à 22:50:51    

Bonjour,
 
Je voudrais faire en sorte qu'une adresse commençant par http:// ou ftp://
soit transformé en lien.
 
J'ai donc fait ceci :
$texte =~ s@(?<!(?:"|'))(http|https|ftp)://([[:alnum:]/\n+-=%&:_.~?]+[#[:alnum:]+]*)@<a
href="$1://$2" target="_blank\">$1://$2</a>@i;
 
Le problème, c'est que si le texte en question était :
<A HREF="http://www.perl.com"> Cliquez ici </A>
 
Alors il devient quelque chose du genre :
<A HREF="<A HREF="http://www.perl.com">" etc..
 
Pouvez m'aider ? Il faudrait détecter si le texte n'est pas précédé par un
<A HREF=' ou un <A HREF=" sans compter les espaces qui peuvent se glisser
entre le lien URL et le guillemet. Pour les guillemets, j'y arrive, mais pour les espaces éventuels qui peuvent s'y glisser, c'est plus dur :
 
<A HRRF=" http://www.machin.com "> par exemple poserait problème.
 
Merci
 
Merci beaucoup !

Reply

Marsh Posté le 30-05-2001 à 22:50:51   

Reply

Marsh Posté le 31-05-2001 à 11:45:27    

extrait de la doc php :
 

Citation :


 
Une assertion se comporte comme un sous-masque, hormis le fait qu'elle
       ne déplace pas le pointeur de position. Les assertions avant
       commencent par (?= pour les assertions positives, et
       par (?!, pour les assertions négatives. Par exemple :
       \w+(?=;) s'assure qu'un mot est suivi d'un point-virgule,
       mais n'inclus pas le point virgule dans la capture. D'autre part,
       (?!foo)bar en est proche, mais ne trouve pas une
       occurrence de "bar" qui soit précédée
       par quelque chose d'autre que "foofoo"; il trouve toutes
       les occurrences de "bar", quelque soit ce qui
       le précéde, car l'assertion (?!foo) est toujours vraie quand les trois caractères suivants sont
        "bar". Une assertion arrière est ici
        nécessaire.
       
Les assertions arrières commencent par (?<= pour les assertions positives, et (?<! pour les
        assertions négatives. Par exemple : (?<!foo)bar trouve les occurrences de "bar" qui ne sont pas
        précédées par "foo".
       

Reply

Marsh Posté le 31-05-2001 à 19:37:58    

minusplus> La question posée concerne Perl, pas PHP...  :sarcastic:  :p  
 
Nicolas> Désolé, je n'ai pas la réponse... mais celle-ci m'intéresse ! :D

Reply

Marsh Posté le 31-05-2001 à 21:25:56    

mais c'est pareil ! les expressions régulières PERL ont été implémentées dans PHP (librairie pcre). je suis allé là passke j'ai plus l'habitude de la doc PHP que de la doc Perl....  
son problème n'est qu'une question de regex, donc qu'elle soit évaluée en PHP, C ou Perl, c'est porail !
 
:p toi même ! :D
 
 
http://fr.php.net/manual/fr/ref.pcre.php

Reply

Marsh Posté le 31-05-2001 à 22:33:56    

Je connait déjà la documentation Perl et je l'ai déjà consulté. Les informations que tu as éditées étaient déjà incluses dans l'expression.  
 
Ma question est la suivante :
 
Comment tester un nombre indéfini d'espaces AVANT tel expression ? La doc le précise, il faut toujours un nombre défini.
 
Ainsi (?<!texte) texte peut contenir 'a' mais pas 'a+'
 
Comment faire ?

Reply

Marsh Posté le 01-06-2001 à 04:15:39    

>Comment tester un nombre indéfini d'espaces AVANT tel expression ?  
 
j'utiliserais ([ ]*) ou bien ([ \t\n]*)  
a priori (avec ou sans parenthese autour selon ce que tu veux matcher.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 01-06-2001 à 10:00:46    

gilou > ben ça va être refusé en tant qu'assertion, c'est pas de longueur fixe !
 
nicolas > j'ai pas compris le coup des informations incluses... ?
sinon, en effet, j'avais mal lu ton post (enfin disons trop vite..). Ben heuu... avec des masques conditionnels ?
en matchant un <A HREF=" et en mettant une condition dessus aprés... ? (je suis trés loin d'être un pro des regexp...)
 

Citation :

Les sous-masques conditionnels
Il est possible de lier un sous-masque à une condition, ou de
       choisir entre deux sous-masques alternatifs, en fonction du
       résultat d'une assertion, ou suivant les résultats
       de recherche précédents.
     
Les deux formes possibles de sous-masques conditionnels sont
       (?(condition)masque positif) et
       (?(condition) masque positif | masque négatif).
     
Si les conditions sont satisfaites, le masque positif est utilisé,
       sinon, le masque négatif est utilisé, si présent.
       S'il y a plus de deux alternatives, une erreur est générée
       à la compilation.
     
Il y a deux types de conditions : si le texte entre les parenthèses
       est une séquence de chiffres, alors la condition est satisfaite si
       le sous-masque correspondant à ce numéro a réussi.
       Considérons le masque suivant, qui contient des espaces non significatifs pour le rendre plus compréhensible (on supposera
       l'option PCRE_EXTENDED activée) et qui est divisé en trois parties
       pour simplifier les explications : ( \( )?    [^()]+    (?(1) \) ).
     
La première partie recherche une parenthèse ouvrante
       optionnelle, et si elle existe, elle est capturée. La deuxième
       partie recherche un séquence de caractères qui ne contiennent
       pas de parenthèses. La troisième partie est
       conditionnée à la première, et s'assure que si il
       y avait une parenthèse ouvrante, il en existe une fermante.
       Si une parenthèse ouvrante a été trouvée,
       elle a été capturée, et donc la première capture existe, et la condition est exécutée. Sinon, elle est
       ignorée.
     

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed