REGEX : je m'arrache les cheveux...


erestrebian
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 472
Inscription: 15 Juin 2007

REGEX : je m'arrache les cheveux...

Message le Mer Avr 27, 2011 10:34

Bonjour,

Je suis en train de passer un site de joomla vers un truc fait maison parce que joomla est un peu trop rigide à mon goût malgré les millions de modules, plugins, templates....

Les liens dans la base de données sont du type :

Code: Tout sélectionner
<a href="index.php?option=com_content&amp;view=article&amp;id=71:la-cellule-phtovoltaique&amp;catid=47:fonctionnement-solaire&amp;Itemid=64">photovoltaïques</a>


et je veux avoir des liens du style

Code: Tout sélectionner
<a href="/solaire/fonctionnement/71-la-cellule-phtovoltaique.html">photovoltaïques</a>


J'ai donc crée une fonction pour faire le travail parce que je suis un gros fainéant et que je voulais pas tout faire à la main (mais finalement, je me demande si ça ne m'aurait pas pris moins de temps)...

Voici ce que j'ai sorti de ma petite tête...

Code: Tout sélectionner
<?php
   error_reporting(E_ALL);
   session_start();
   require_once('*****.php5');         //script d'appel de la base

   $sql_article = "SELECT id, introtext
         FROM `article`
         GROUP BY id
         ORDER BY `id` DESC
         LIMIT 0 , 10";
   $articles = mysql_query ($sql_article);

   function renomme($match)
   {
          list($_unused, $lamerde, $idart, $lamerde2, $texte) = $match;
      $sql_lien = "SELECT a.id, a.alias as aalias, t.alias as talias, c.alias as calias
            FROM `article` a, themes t, categories c
            WHERE t.id = a.sectionid
            AND c.id = a.catid
            AND a.id = " . $idart . "
            GROUP BY a.id";
      $liens = mysql_query ($sql_lien);
      $lien = mysql_fetch_assoc($liens);
          return '<a href="'.$lien['talias'].'/'.$lien['calias'].'/'.$lien['id'].'-'.$lien['aalias'].'.html">'.$texte.'</a>';
   }

   while ($article=mysql_fetch_assoc($articles))
   {
      $article['introtext'] = preg_replace_callback('#<a href="index\.php\?(.*)&amp;id=(\d+):(.*)">(.*)</a>#', 'renomme', $article['introtext']);
      echo utf8_decode($article['introtext']);
   }
?>


Cela marche pour le lien donné au dessus mais pas pour celui-ci :

Code: Tout sélectionner
<a href="index.php?option=com_content&amp;view=article&amp;id=145:le-bois&amp;catid=68:biomasse&amp;Itemid=84">bois</a>


Merci pour tous les commentaires qui pourraient me mettre sur la piste de l'origine de ce dysfonctionnement que je commence à considérer comme magique malgré mon esprit cartésien...

tonguide
WRInaute passionné
WRInaute passionné
 
Messages: 1407
Inscription: 28 Nov 2003

Re: REGEX : je m'arrache les cheveux...

Message le Mer Avr 27, 2011 11:15

C'est ton "$idart" qui n'est pas trouvé pour le second exemple ?


erestrebian
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 472
Inscription: 15 Juin 2007

Re: REGEX : je m'arrache les cheveux...

Message le Mer Avr 27, 2011 11:25

En fait, il ne considère que le &amp;id=(\d+) du lien suivant (qui est le dernier si cela peut avoir une quelconque influence)... Je ne sais pas si c'est clair mais disons que dans l'analyse de l'expression rationnelle, il ne "s'arrête" pas sur le lien qui concerne le bois. La fonction s'exécute donc mais avec un $idart qui est une chaîne...

J'ai essayé de délimiter l'expression avec des ^ et des $ mais dans ce cas-là, rien ne fonctionne...

Merci pour ton aide.

tonguide
WRInaute passionné
WRInaute passionné
 
Messages: 1407
Inscription: 28 Nov 2003

Re: REGEX : je m'arrache les cheveux...

Message le Mer Avr 27, 2011 11:56

J'ai pas vraiment bien compris ce que tu voulais dire, mais essai ça :

#<a href="index\.php\?([^"]*)&amp;id=(\d+):([^"]*)">([^<]*)</a>#si


erestrebian
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 472
Inscription: 15 Juin 2007

Re: REGEX : je m'arrache les cheveux...

Message le Mer Avr 27, 2011 12:26

merci, l'erreur fut différente mais cela (ajouter au repas) m'a mis sur la piste d'une erreur dans la base de données... les sectionid n'existaient plus dans la base theme...

encore merci et désolé du dérangement...


Si vous avez aimé cette discussion, partagez-la sur vos réseaux sociaux préférés :

Lectures recommandées sur ce thème :



Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités