<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 :/
Version imprimable
<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 attendsCode:
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: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:<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:
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: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:
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); ?>
Citation:
contenu photo tag contenu photo tag
Ca appelle ta fonction.Code:
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 :
Citation:
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:
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 êtreCode:$regex.= sprintf('<(a|%s)\b[^>]*>.*?%s.*?</\2>|', $tags, $mot);
testCode:$regex.= sprintf('<(a|%s)\b[^>]*>.*?</\2>|', $tags, $mot);
avantCode:
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èsCode:contenu photo tag contenu photo tag
codeCode:<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:
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:
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 :
http://img329.imageshack.us/img329/8348/lien.jpg
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é:
avantCode:
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èsCode:
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:<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:
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.