<strong>voiture</strong> deviendra <em>voiture</em> avec ta dernière fonction alors que dans ce caslà, j'aurais voulu avoir<strong><em>voiture</strong></em>
C'est compliqué de prendre en compte toutes ces contraintes :/
<strong>voiture</strong> deviendra <em>voiture</em> avec ta dernière fonction alors que dans ce caslà, j'aurais voulu avoir<strong><em>voiture</strong></em>
C'est compliqué de prendre en compte toutes ces contraintes :/
Le cas limite s'applique aussi à tes ajouts. Si tu veux ajouter <strong> sur voiture de même que <strong> et <em> en alternance sur voiture... le seul moyen de contourner le nettoyage est de faire d'abord array('strong', 'em) et ensuite array('strong');
Produira ce que tu attends
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 <?php $test = '1ere voiture, 2e voiture, 3e voiture, 4e voiture et une dernière voiture pour la route'; $test = ajouter_tags($test, 'voiture', array('strong', 'em'), 4); $test = ajouter_tags($test, 'voiture', array('strong'), 4); echo $test; ?>
Alors que dans l'ordre inverse, les <strong> seront remplacés (détruit/ajouté) comme tu l'as demandé.
Code : Sélectionner tout - Visualiser dans une fenêtre à part 1ere <strong>voiture</strong>, 2e <em><strong>voiture</strong></em>, 3e <strong>voiture</strong>, 4e <em><strong>voiture</strong></em> et une dernière voiture pour la route
Et si je veux :
COmment puis je faire ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part <em><strong>voiture</em></strong>, 2e <em><strong>voiture</strong></em>
pas d'alternance dans ce cas là donc.
Car dans tous les cas, jvais en supprimer des balises. :/
Produira:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 <?php $test = '1ere voiture, 2e voiture, 3e voiture, 4e voiture et une dernière voiture pour la route'; $test = ajouter_tags($test, 'voiture', array('em'), 4); $test = ajouter_tags($test, 'voiture', array('strong'), 4); echo $test; ?>
Code : Sélectionner tout - Visualiser dans une fenêtre à part 1ere <em><strong>voiture</strong></em>, 2e <em><strong>voiture</strong></em>, 3e <em><strong>voiture</strong></em>, 4e <em><strong>voiture</strong></em> et une dernière voiture pour la route
Merci pour tout.
Tout devrait marcher maintenant.
Et bah non, je fais juste des tests de base et ça marche pas une fois de plus.
J'ai beau mettre n'importe quelle limite dans la fonction, ça marche pas dans mon application, je pige pas.
donc j'ai :chaque case du tableau $text contient :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 <?php $n=$NO->replace($mot,array('strong'),$te,$url,$text,$occurence,$te,$b); $n=$NO->replace($mot,array('em'),$te,$url,$n,$occurence,$te,$b); ?>contenu photo tag contenu photo tagCa appelle ta fonction.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 <?php public function replace($key,$balise,$a,$url,$text,$occurence,$i,$b){ $NO =new SiteNO(); $nombre=$occurence; for($j=0;$j<$i;$j++){ for($v=0;$v<count($text);$v++){ if($j==$v){ $text[$v]=$NO->ajouter_tags($text[$v],''.$key[$v].'',$balise,4); } else{ if($key[$j]!=$key[$v]){ $text[$v]=$NO->ajouter_lien($text[$v], $key[$j], $url[$j]); } } } } return $text; } ?>
Mais j'obtiens ça :
Pour text[0] et text[1] (mot clé contenu ):
<strong><em>contenu</em></strong> <a href="
tag.php">tag</a> <a href="
photo.php">photo</a> <strong>contenu</strong> <a href="
tag.php">tag</a> <a href="
photo.php">photo</a>
Pour text[2] et text[3] (mot clé photo ):
<a href="contenu.php">contenu</a> <a href="
tag.php">tag</a> photo <a href="contenu.php">contenu</a> <a href="
tag.php">tag</a> <strong><em>photo</em></strong>
Pour text[4] et text[5] (mot clé tag ) :
<a href="contenu.php">contenu</a> tag <a href="
photo.php">photo</a> <a href="contenu.php">contenu</a>
Ha et ya aussi des retours à la ligne non voulus qui sont bien chiants car mal interprétés dans la BDD :/
Une idée d'où ça peut venir car à la base ta fonction marche bien ?
Ce que je pige pas c'est que j'utilise toujours la même fonction et ça me donne des résultats différents, c'est bizarre :/
Après d'autres texts, ça viendrait de ça :Le $text[$v] passe mal car si je mets directement la phrase, ça marche :/
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 <?php if($j==$v){ $text[$v]=$NO->ajouter_tags($text[$v],''.$key[$v].'',$balise,4); ?>
Mais je vois pas quoi changer
}
Oui, c'est mon erreur sur la ligne
Qui doit être
Code : Sélectionner tout - Visualiser dans une fenêtre à part $regex.= sprintf('<(a|%s)\b[^>]*>.*?%s.*?</\2>|', $tags, $mot);
test
Code : Sélectionner tout - Visualiser dans une fenêtre à part $regex.= sprintf('<(a|%s)\b[^>]*>.*?</\2>|', $tags, $mot);
avant
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 $text[0] = 'contenu photo tag contenu photo tag'; $text[0] = ajouter_tags($text[0], 'contenu', array('strong'), 4); $text[0] = ajouter_lien($text[0], 'tag', 'tag.php'); $text[0] = ajouter_tags($text[0], 'contenu', array('em'), 4); $text[0] = ajouter_lien($text[0], 'photo', 'photo.php'); echo $text[0];
après
Code : Sélectionner tout - Visualiser dans une fenêtre à part contenu photo tag contenu photo tag
code
Code : Sélectionner tout - Visualiser dans une fenêtre à part <strong><em>contenu</em></strong> <a href="photo.php">photo</a> <a href="tag.php">tag</a> <strong><em>contenu</em></strong> <a href="photo.php">photo</a> <a href="tag.php">tag</a>
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65 <?php function ajouter_tags($html, $mot, $balises, $limite=-1, $inclues=array(), &$count=null) { // extraction $tags = implode('|', array_merge($balises, $inclues)); // (?:<(?:%1$s)>)+(%2$s)(?:</(?:%1$s)>)+ toutes imbrications de tags (en $1) $regex = sprintf('@(?:<(?:%1$s)>)+(%2$s)(?:</(?:%1$s)>)+|', $tags, $mot); // <(a|%s)\b[^>]*>.*?</\2> tout autres tags pouvant contenir le mot (skip) $regex.= sprintf('<(a|%s)\b[^>]*>.*?</\2>|', $tags, $mot); // </?\w+[^>]+> tout attribut pouvant contenir le mot (skip) $regex.= '</?\w+[^>]+>|'; // \b(%s)\b toutes les occurrences du mot dans le contenu (capturé en $3) $regex.= sprintf('\b(%s)\b@si', $mot); $options = PREG_SET_ORDER | PREG_OFFSET_CAPTURE; preg_match_all($regex, $html, $captures, $options); // Les remplacements pour substr_replace, sans les skips ou tags existants // les skip incluent aussi les liens <a></a>. $remplacements = array(); foreach ($captures as $index => $capture) { // si $capture[3] n'est pas vide, alors c'est le mot exact dans le contenu if (!empty($capture[3])) { $remplacements[] = array( 'mot' => $capture[3][0], // le mot 'offset' => $capture[3][1], // l'offset 'longueur' => strlen($capture[3][0]), // longueur ); } // si $capture[2] est vide et que $capture[1] n'est pas vide // alors c'est un tag ou imbrication de tags contenant le mot exact else if (empty($capture[2]) && !empty($capture[1])) { $remplacements[] = array( 'mot' => $capture[1][0], // le mot sans tags 'offset' => $capture[0][1], // l'offset avec tags 'longueur' => strlen($capture[0][0]), // avec tags ); } // sinon, aucun transfert car c'était un skip. } // considérer la limite maximale de remplacements, -1 pour tous if ($limite > -1) $remplacements = array_slice($remplacements, 0, $limite); $count = count($remplacements); // retourner le nombre de remplacements fait // faire les remplacements en alternance selon le contenu de $remplacements // array_reverse permet de conserver les offsets valides pour subst_replace $i = count($remplacements); // nombre de remplacements à faire $n = count($balises); // nombre de balises à alterner foreach (array_reverse($remplacements) as $remplacement) { $i--; $remplacer = sprintf('<%1$s>%2$s</%1$s>', $balises[$i % $n], $remplacement['mot']); $html = substr_replace($html, $remplacer, $remplacement['offset'], $remplacement['longueur']); } // retour return $html; } ?>
Je ne suis pas certaine de comprendre. S'il y a un retour à la ligne au début de l'url dans la base de données comme semble monter ton résultat, alors trim() devrait l'enlever.
Pour tester si c'est le cas,
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 <?php echo '<pre>', print_r($url, true), '</pre>'; $n=$NO->replace($mot,array('strong'),$te,$url,$text,$occurence,$te,$b); $n=$NO->replace($mot,array('em'),$te,$url,$n,$occurence,$te,$b); ?>
Quand je fais trim($text[$v])
Ca ne change rien.
Pour être plus clair, voici un imprim écran de la BBD :
Et c'est vraiment embêtant car si je refais une optimisation, ça me supprime toute la BDD client
Les deux traits verticaux ajoutés après le <a href=", c'est juste pour montrer que c'est là qu'il y a un soucis :o
Parce qu'il faut faire trim($url[$j]) selon ce que tu décris.
Que donne le print_r du code ci-dessous ?
J'ai testé:
avant
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 <?php $test = '<strong><em>contenu</em></strong> <a href=" photo.php">photo</a> <a href=" tag.php">tag</a> <strong><em>contenu</em></strong> <a href=" photo.php">photo</a> <a href=" tag.php">tag</a>'; $test = ajouter_lien($test, 'photo', 'new_photo.php', 4); $test = ajouter_tags($test, 'contenu', array('strong','em'), 4); $test = ajouter_lien($test, 'tag', 'new_tag.php', 4); echo $test; ?>
après
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 <strong><em>contenu</em></strong> <a href=" photo.php">photo</a> <a href=" tag.php">tag</a> <strong><em>contenu</em></strong> <a href=" photo.php">photo</a> <a href=" tag.php">tag</a>
Ce qui est le résultat attendu. Quelle re-optimisation as-tu tenté sur:
Code : Sélectionner tout - Visualiser dans une fenêtre à part <strong>contenu</strong> <a href="new_photo.php">photo</a> <a href="new_tag.php">tag</a> <em>contenu</em> <a href="new_photo.php">photo</a> <a href="new_tag.php">tag</a>
Je ne vois pas pourquoi un retour à la ligne ferait un UPDATE destructif, mais je ne suis pas une spécialiste SQL. Si je ne suis pas en erreur sur ce fait, alors en toute logique il y a une remise à vide de la variable avant UPDATE.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 <strong><em>contenu</em></strong> <a href=" photo.php">photo</a> <a href=" tag.php">tag</a> <strong><em>contenu</em></strong> <a href=" photo.php">photo</a> <a href=" tag.php">tag</a>
Avec le trim sur url($j)ça a l'air de marcher.
Mais logiquement, le faire sur $text[$v], ça n'aurait pas du marcher ?
Plus de suppresion de BDD, je vois le bout du tunnel là :o
Oui mais après ça, $url[$j] se retrouve dans $text[$v], spour ça que ça me semble bizarre.
Fin, bref, tout marche et tout ça grâce à toi, sans toi, j'y serais encore fin aout.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager