Aller au contenu

tisha_carpenter

Membre
  • Compteur de contenus

    9
  • Inscrit(e) le

  • Dernière visite

Tout ce qui a été posté par tisha_carpenter

  1. Donc, $_GET['page'] contiendra "news" lors de l'include de "news.php". Dans "news.php" l'on peut lire Comme $_GET['page'] contient "news", alors $firstnews sera un négatif (-$maxnews) et je doute que MySQL aime une limite négative.
  2. (?<nom>pattern) est l'une des syntaxes alternatives pour nommer un sous-motif depuis PCRE 7.0 et (?P<nom>pattern) est la syntaxe pure PCRE qui fonctionnera aussi avec PHP4, ce qui semble être ton cas. Mais si cette chose est la pointe de l'iceburg, peut-être qu'utiliser les dernières versions stables de PHP5 et Apache2 serait préférable car jusqu'à PCRE 7.6 l'espace n'est pas autorisé comme caractère dans le nom d'un sous-motif ! La dernière version stable de PCRE est la 7.8 que je n'ai pas pour tester. Je n'utiliserai jamais joomla
  3. Peut-être fait en javascript. Comme ce n'est pas trop compliqué, j'ai un petit exemple. <html> <head> <title>Exemple Focus Rotatif</title> <script type="text/javascript"> var button = -1; // -1 au démarrage seulement var last_button = 5; // le dernier id est button5 var delay = 5000; // 5 secondes function next_button() { if (++button > last_button) button = 0; document.getElementById('button'+button).focus(); setTimeout('next_button()', delay); } </script> </head> <body onload="next_button();"> <form> <input type="button" id="button0" value="Google" onclick="document.location.href='http://www.google.com/'"> <input type="button" id="button1" value="Yahoo" onclick="document.location.href='http://www.yahoo.com/'"> <input type="button" id="button2" value="WebmasterHub" onclick="document.location.href='http://www.webmaster-hub.com/'"> <input type="button" id="button3" value="Wikipedia" onclick="document.location.href='http://www.wikipedia.org/'"> <input type="button" id="button4" value="YouTube" onclick="document.location.href='http://www.youtube.com/'"> <input type="button" id="button5" value="DailyMotion" onclick="document.location.href='http://www.dailymotion.com/'"> </form> </body> </html> Par contre, je ne suis pas très certaine de correctement interpréter "La personne clique (ça, elle peut)". Si ce n'est pas uniquement avec la touche entrée du clavier, mais aussi avec le clic de souris n'importe où dans le document, alors il faut aussi ajouter un évènement pour ça. <html> <head> <title>Exemple Focus Rotatif</title> <script type="text/javascript"> var button = -1; // -1 au démarrage seulement var last_button = 5; // le dernier id est button5 var delay = 5000; // 5 secondes function next_button() { if (++button > last_button) button = 0; document.getElementById('button'+button).focus(); setTimeout('next_button()', delay); } function button_click() { var click = document.getElementById('button'+button); click.onclick(); click.focus(); } </script> </head> <body onload="next_button();" onclick="button_click();"> <form> <input type="button" id="button0" value="Google" onclick="document.location.href='http://www.google.com/'"> <input type="button" id="button1" value="Yahoo" onclick="document.location.href='http://www.yahoo.com/'"> <input type="button" id="button2" value="WebmasterHub" onclick="document.location.href='http://www.webmaster-hub.com/'"> <input type="button" id="button3" value="Wikipedia" onclick="document.location.href='http://www.wikipedia.org/'"> <input type="button" id="button4" value="YouTube" onclick="document.location.href='http://www.youtube.com/'"> <input type="button" id="button5" value="DailyMotion" onclick="document.location.href='http://www.dailymotion.com/'"> </form> </body> </html>
  4. C'est pas plutôt l'inverse? Car si c'est l'inverse, alors c'est un format CSV et la fonction fgetcsv() gère les subtilités de ce format.
  5. Si c'est pour faire un genre de include_string(), alors eval() est bien la bonne fonction. Par contre, eval() considère un <?php implicite, il faut donc simplement le fermer par un ?> explicite: <?php function monurl($param1,$param2) { echo "'monurl a reçu $param1 et $param2'"; } $texte=' Cinq journées de marche dans le désert, accessibles à tous, des étapes variées, entre les palmeraies de la <?php monurl(\'draa\', $lg) ?>, les regs arides de la hamada qui commence aux portes de Tazzarine, et les oasis naturelles qui abritent encore aujourd\'hui les nomades berbères. '; $lg=8; eval('?>'.$texte); // devient include_string(); ?> Attention aux possibles injections de code PHP.
  6. Tu es dans un environnement configuré en autre chose que ISO-8859-(1 ou 15). PHP récupère les facilités du système d'exploitation sous le nom de locale et la fonction PHP setlocale() peut changer cette configuration le temps de l'exécution du script si la "locale" voulue est accessible par le système d'exploitation (et au moins PHP 4.3). Toutes les fonctions string de PHP sont soumises à cette configuration. Il y a toujours moyen de contourner ou de s'adapter si un changement de configuration est impossible et que setlocale() ne donne aucun résultat. Mais à la base, tu es en présence d'un problème de configuration. La ligne suivante devrait te dire dans quel encodage ton système est: <?php echo setlocale(LC_CTYPE,null); ?> Ce que j'avais posté ici concernait le mot et non pas la phrase. La classe \b est à proscrire car \b est très très gourmant et refusera tout caractère non-mot à l'intérieur de l'énumération, \b doit être utilisé uniquement pour délimiter un mot car il donne un gain en temps d'exécution (cf.: test rapidement l'échec). Par contre dans la fonction ajouter_liens, la ligne: $regex='#<('.$balises.')[\s>].+?</\1>|<[^>]+>|\b('.$mots.')\b#si'; peut-être remplacer par: $regex='#<('.$balises.')[\s>].+?</\1>|<[^>]+>|(?<=\W)('.$mots.')(?=\W)#si'; Et ça devrait fonctionner aussi pour la phrase comme pour le mot sur un tri par longueur comme dans ton code. Surtout pour array('la très belle'=>'tisha carpenter'); Je vois pas comment soulager ta base, sauf par une mise en cache de la requête. Car il devient impossible de savoir si un espace doit être conservé ou éliminé, à moins de faire aussi toutes les combinaisons de 2 mots par proximité, ce qui serait un tout autre genre de bestiaux. Ne devrait plus être nécessaire après la correction regex proposée un peu plus haut. Dans un bon encodage de caractère, bien entendu. Ta base est encodé en quoi? Tes documents HTML sont encodés en quoi? OK. Je vais essayer de faire ma prof aucune garantie de satisfaction. Le méta-caractère | permet d'énumérer des possibilités sous la forme de OU logique. L'ordre d'énumération est important puisqu'il doit aller du plus important au moins important. J'utilise ce | pour énumérer 3 hypothèses Hypothèse des balises exclues <('.$balises.')[\s>].+?</\1> Revient à isoler de la balise ouvrante à la balise fermante inclusivement selon l'énumération contenu dans $balises. Par exemple, le HTML "<h1>une texte de titre</h1>" sera complètement capturer en un bloc parce que h1 fait partie de $balises. Hypothèse des attributs des autres balises <[^>]+> Permet d'isoler tous les attributs des autres balises car le mot pourrait être présent dans ces attributs. Hypothèse des phrases/mots recherchés (?<=\W)('.$mots.')(?=\W) Isolera une phase/mot de l'énumération contenu dans $mots, qui est précédé et suivi par un caractère \W, donc précédé ou suivi par un caractère non-mot tel que défini par locale (ref.: setlocale). Voilà donc pourquoi $regex='#<('.$balises.')[\s>].+?</\1>|<[^>]+>|(?<=\W)('.$mots.')(?=\W)#si'; Le preg_replace_callback($regex,__FUNCTION__,$html); permet de valider quelle partie de la chaine est isolée, si l'expression régulière est satisfaite avant d'arriver à la seconde parenthèse qui énumère les phases/mots alors la capture numéro 2 sera indéfini... donc aucun changement. Par contre, si la capture de la seconde parenthèse est définie, alors un mot/phrase à remplacer a été trouvé. Le code PHP exécuter par ce callback est: // Traitement php de l'appel récursif sur preg_replace_callback if(isset($html[2])) { // un mot a été trouvé pour remplacement $mot_texte=$html[0]; $mot_url=strtolower($mot_texte); if(count($mots_id)) { // S'il y a une relation id=>mot alors transposer $mot_url=array_search($mot_url,$mots_id,true); if(!$mot_url) return $html[0]; // Couvrir un échec (peu probable) $mot_url=strtolower($mot_url); } return sprintf($remplacement,rawurlencode($mot_url),$mot_texte); } return $html[0]; // Cas où aucun remplacement Qui est la logique expliquée plus haut Le tout en parcourant une seule fois le document HTML. En espérant que mon message t'aidera à progresser vers ton objectif. Tisha
  7. Même si je ne suis pas certaine de la forme de ton array, j'ai ajouté le paramètre $cle_url qui, à true, fait la transposition sur un array de la forme id=>mot. En espérant que c'est la forme de ton array. Désolée, je ne peux pas éditer le message#2 CODE <?php // La fonction *** ajouter_liens *** // ********************************* // 1) $cle_url à false rend le mot en minuscule (url encodé) dans l'url // 2) $cle_url à true rend la clé du mot en minuscule (url encodé) dans l'url // Le array $mots peut avoir une relation id=>mot textuelle // $cle_url est à false par défaut function ajouter_liens($html,$mots=array(),$cle_url=false) { // Les éléments html à exclure static $balises_exclues=array('head','script','h[1-6]','a'); // Format du remplacement static $remplacement='<a href="?word=%s">%s</a>'; // Pour le traitement interne id=>mot static $mots_id=array(); // Le traitement regex, appel d'origine if(!is_array($html)) { if(!is_string($html)||!is_array($mots)||count($mots)==0) return $html; $mots_id=array(); // S'assurer que la liste statique est vidée if($cle_url) { // Générer $mots_id si id=>mot est désiré $mots_id=array_map('strtolower',$mots); } $balises=implode('|',$balises_exclues); $mots=implode('|',array_map('preg_quote',$mots)); $regex='#<('.$balises.')[\s>].+?</\1>|<[^>]+>|\b('.$mots.')\b#si'; return preg_replace_callback($regex,__FUNCTION__,$html); // Appel récursif } // Traitement php de l'appel récursif sur preg_replace_callback if(isset($html[2])) { // un mot a été trouvé pour remplacement $mot_texte=$html[0]; $mot_url=strtolower($mot_texte); if(count($mots_id)) { // S'il y a une relation id=>mot alors transposer $mot_url=array_search($mot_url,$mots_id,true); if(!$mot_url) return $html[0]; // Couvrir un échec (peu probable) $mot_url=strtolower($mot_url); } return sprintf($remplacement,rawurlencode($mot_url),$mot_texte); } return $html[0]; // Cas où aucun remplacement } // ajouter_liens // Tester la fonction $ancien_html = '<h1>le gros titre</h1> <h2>le moyen titre</h2> <p>un paragraphe contenant des gros mots et aussi un lien <a href="protection.html">protection</a> qui ne doit pas être modifié</p> <p>mais ce mot protection doit être converti</p>'; // Test avec valeur par défaut $cle_url=false echo '<hr><b>$cle_url=false</b> Valeur par défaut<br>'; $liste_mots=array('gros','mots','protection','doit'); $nouveau_html=ajouter_liens($ancien_html,$liste_mots); echo '<pre>',htmlentities($nouveau_html),'</pre>'; // Test avec valeur $cle_url=true echo '<hr><b>$cle_url=true</b> clé=>valeur Transposé<br>'; $liste_mots=array(121=>'gros',617=>'mots',22=>'protection','devoir'=>'doit'); $nouveau_html=ajouter_liens($ancien_html,$liste_mots,true); echo '<pre>',htmlentities($nouveau_html),'</pre>'; ?> Par contre dû à l'id, je me demande si tu as une grande quatité de mots pouvant originer d'une base de données ou de RSS/XML? Si c'est le cas, la fonction suivante t'inspirera peut-être, elle construit les mots uniques possibles d'un document HTML, son résultat peut-être utilisé directement dans la clause IN d'une requête SQL sur une base en ISO (latin1), car tout ce qui est posté ici est en ISO. CODE <?php // La fonction function extraire_mots($html) { $balises=implode('|',array('head','script','h[1-6]','a')); // les exclusions $regex='#<('.$balises.')[\s>].+?</\1>|</?[^>]+>|[^\w<]+#si'; $mots=preg_split($regex,$html,-1,PREG_SPLIT_NO_EMPTY); return '\''.implode('\',\'',array_unique(array_map('strtolower',$mots))).'\''; } // Tester la fonction $html = '<h1>le gros titre</h1> <h2>le moyen titre</h2> <p>Un paragraphe contenant des gros mots et aussi un lien <a href="protection.html">protection</a> qui ne doit pas être modifié</p> <p>mais ce mot protection doit être converti</p>'; $mots=extraire_mots($html); $query="SELECT id_mot,mot FROM mots WHERE mot IN ($mots);"; echo "<pre><b>Exemple de query:</b>\n$query</pre>"; ?> Si utilisée, alors une classe serait la bienvenue dans ton cas pour au moins uniformiser la définition des balises exclues. Tisha
  8. simple? <?php // la fonction function ajouter_liens($html,$mots=array()) { // les éléments html à exclure static $balises_exclues=array('head','script','h[1-6]','a'); // format du remplacement static $remplacement='<a href="?word=%s">%s</a>'; // le traitement regex if(!is_array($html)) { if(!is_string($html)||!is_array($mots)||count($mots)==0) return $html; $balises=implode('|',$balises_exclues); $mots=implode('|',array_map('preg_quote',$mots)); $regex='#<('.$balises.')[\s>].+?</\1>|<[^>]+>|\b('.$mots.')\b#si'; return preg_replace_callback($regex,__FUNCTION__,$html); } if(isset($html[2])) return sprintf($remplacement,rawurlencode($html[0]),$html[0]); return $html[0]; } // ajouter_liens // tester la fonction $HTML = '<h1>le gros titre</h1> <h2>le moyen titre</h2> <p>un paragraphe contenant des gros mots et aussi un lien <a href="protection.html">protection</a> qui ne doit pas etre modifié</p> <p>mais ce mot protection doit être converti</p>'; $nouveau_html=ajouter_liens($HTML,array('gros','mots','protection','doit')); echo '<pre>',htmlentities($nouveau_html),'</pre>'; ?>
  9. preg_replace_callback exécute le code php à chacune des occurences, et non toutes les occurences d'un bloc comme ton code semble être construit. il n'est pas utile de t'intéresser à autre chose que [bbcode] et [/bbcode] qui peut s'écrire #\[/?bbcode\]# s'en plus. pour l'incrémentation en procédural, tu peux utiliser une variable statique dans la fonction bbcode_id, une variable statique est similaire à une variable globale sauf que sa portée est limitée à la fonction et sa définition exécutée qu'une seule fois. sinon preg_replace_callback va bien dans une classe <style type="text/css"> div {display:inline;} #bbcode_1 {color:red;} #bbcode_2 {color:blue;} #bbcode_3 {color:green;} #bbcode_4 {color:magenta;} #bbcode_5 {color:cyan;} </style> <?php function bbcode($text){ return preg_replace_callback('#\[/?bbcode\]#', 'bbcode_id', $text); } function bbcode_id($matches){ static $i=0; if(substr($matches[0],1,1)=='/') { // est-ce [/bbcode] ? // alors retourner </div> return '</div>'; } // donc c'est [bbcode] // alors incrémenter $i et retourner <div id="..."> return '<div id="bbcode_'.(++$i).'">'; } $contenu='[bbcode]salut [bbcode]et[bbcode] bonjour.[/bbcode][/bbcode] [bbcode]ceci est-il valable?[/bbcode][/bbcode] [bbcode] j\'espère bien :[[/bbcode]'; echo htmlentities($resultat=bbcode($contenu)),'<hr>',$resultat; ?>
×
×
  • Créer...