Ce n'est pas faux :baby:
Merci pour tout.
Je lance tout ça demain et je te dis si ça marche.
Ca marche, merci beaucoup :o
Mais sérieusement, ya vraiment aucun moyen de mettre à jour un lien sans que ça risque de nuire au reste ?
Bonjour, j'ai encore un petit problème avec l'une des fonctions :
Voilà, j'ai ces 6 textes à la base :
J'utilise cette fonction :text[0]= contenu photo tag contenu photo tag contenu photo tag contenu photo tag contenu photo tag contenu photo tag contenu photo tag contenu photo tag contenu photo tag ;
text[1]=0
text[2]=contenu photo tag contenu photo tag contenu photo tag contenu photo tag contenu photo tag contenu photo tag contenu photo tag contenu photo tag contenu photo tag
text[3]=0
text[4]=contenu photo tag contenu photo tag contenu photo tag contenu photo tag contenu photo tag contenu photo tag contenu photo tag contenu photo tag contenu photo tag
text[5]=0
Au final, le nombre d'occurrences n'est pas le bon, je mets 15 en occurrences et ça donne :
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 $n=$NO->replace($mot,$balise[$t],$te,$url,$text,$occurence,$te,$b); 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->mon_remplacement($text[$v],''.$key[$v].'',''.$balise.'',$occurence); } } } } return $text; } //fonction mon_remplacement(...) public function mon_remplacement($html, $mot=false, $balise=false, $occurence=-1) { static $tag = null; if (is_string($html) && is_string($mot) && is_string($balise)) { $tag = $balise; $regex = sprintf('@<%1$s\b[^>]*>.*?</%1$s>|</?[^>]+>|\b(%2$s)\b@si', $tag, $mot); return preg_replace_callback($regex, array($this, 'mon_remplacement'), $html,$occurence); } if (is_array($html)) { if (empty($html[1])) return $html[0]; // ne rien faire return sprintf('<%1$s>%2$s</%1$s>', $tag, $html[1]); // ajouter } return $html; }
Je ne vois absolument pas d'où vient le problème.text[0]=<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> <strong>contenu</strong> <a href="photo.php">photo</a> <a href="tag.php">tag</a> <strong>contenu</strong> <a href="photo.php">photo</a> <a href="tag.php">tag</a> <strong>contenu</strong> <a href="photo.php">photo</a> <a href="tag.php">tag</a> <strong>contenu</strong> <a href="photo.php">photo</a> <a href="tag.php">tag</a> <strong>contenu</strong> <a href="photo.php">photo</a> <a href="tag.php">tag</a> <strong>contenu</strong> <a href="photo.php">photo</a> <a href="tag.php">tag</a> <strong>contenu</strong> <a href="photo.php">photo</a> <a href="tag.php">tag</a>
text[1]=0
text[2]=<a href="contenu.php">contenu</a> <strong><em>photo</em></strong> <a href="tag.php">tag</a> <a href="contenu.php">contenu</a> <strong><em>photo</em></strong> <a href="tag.php">tag</a> <a href="contenu.php">contenu</a> <strong>photo</strong> <a href="tag.php">tag</a> <a href="contenu.php">contenu</a> <strong>photo</strong> <a href="tag.php">tag</a> <a href="contenu.php">contenu</a> <strong>photo</strong> <a href="tag.php">tag</a> <a href="contenu.php">contenu</a> photo <a href="tag.php">tag</a> <a href="contenu.php">contenu</a> photo <a href="tag.php">tag</a> <a href="contenu.php">contenu</a> photo <a href="tag.php">tag</a> <a href="contenu.php">contenu</a> photo <a href="tag.php">tag</a> <br />
text[3]=0
text[4]=<a href="contenu.php">contenu</a> <a href="photo.php">photo</a> <strong><em>tag</em></strong> <a href="contenu.php">contenu</a> <a href="photo.php">photo</a> <strong><em>tag</em></strong> <a href="contenu.php">contenu</a> <a href="photo.php">photo</a> <strong>tag</strong> <a href="contenu.php">contenu</a> <a href="photo.php">photo</a> tag <a href="contenu.php">contenu</a> <a href="photo.php">photo</a> tag <a href="contenu.php">contenu</a> <a href="photo.php">photo</a> tag <a href="contenu.php">contenu</a> <a href="photo.php">photo</a> tag <a href="contenu.php">contenu</a> <a href="photo.php">photo</a> tag <a href="contenu.php">contenu</a> <a href="photo.php">photo</a> tag
text[5]=0
Quel aurait été le bon résultat? Dans $text[0] il y a: 9 mots "contenu", 9 mots "tag" et 9 mots "photo". Alors faire un remplacement limité à 15 sur 9 mots "contenu" est équivalent à tout remplacer vu d'ici.
Donc, tu veux probablement lier des comptes entre eux, mais je suis pas certaine si tu veux:
- que tous les remplacements sur $text[0] soient limités à 15.
- qu'un remplacement sur tous les morceaux de $text soit limité à 15.
- ou les 2 possibilités en même temps.
Dans tous les cas, il faudra ajouter un paramètre pour avoir un retour du nombre de remplacements effectués, qui pourra ensuite être enlevé de $occurence pour les remplacements suivants... selon le besoin.
J'ai fait l'ajout de ce paramètre dans les 2 fonctions (j'ai renommé mon_remplacement en ajouter_tags). Avec un petit exemple pour lier les comptes des morceaux de $text entre eux, sur les 3 genres de remplacements que tu sembles faire.
Ces 2 fonctions deviennent de plus en plus identiques, à toi d'optimiser.
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130 <?php function ajouter_tags($html, $mot, $balises, $limite=-1, &$count=null) { // extraction $tags = implode('|', $balises); $skip_tags = sprintf('<(a|%s)\b[^>]*>.*?\b%s\b.*?</\1>', $tags, $mot); $regex = sprintf('@%s|</?([^>]+)>|\b%s\b@si', $skip_tags, $mot); $options = PREG_SET_ORDER | PREG_OFFSET_CAPTURE; preg_match_all($regex, $html, $captures, $options); // éliminer les skips foreach ($captures as $index => $capture) { if (count($capture)>1) unset($captures[$index]); else $captures[$index] = $capture[0]; // conserver seulement la capture 0 } // considérer la limite maximale de remplacements, -1 pour tous if ($limite > -1) $captures = array_slice($captures, 0, $limite); $count = count($captures); // retourner le nombre de remplacements fait // ajouter les balises en alternances $i = count($captures); // nombre de remplacement à faire $n = count($balises); // nombre de balises à alterner foreach (array_reverse($captures) as $capture) { $i--; $remplacer = sprintf('<%1$s>%2$s</%1$s>', $balises[$i % $n], $capture[0]); $html = substr_replace($html, $remplacer, $capture[1], strlen($capture[0])); } // retour return $html; } function ajouter_lien($html, $mot, $url, $limite=-1, &$count=null) { // extraction $regex = sprintf('@<a\b[^>]+>.*?</a>|</?\w+[^>]+>|\b(%s)\b@si', $mot); $options = PREG_SET_ORDER | PREG_OFFSET_CAPTURE; preg_match_all($regex, $html, $captures, $options); // enlever les non-remplacements qui étaient obligés pour émuler un "skip" foreach ($captures as $index => $capture) { // s'il n'y a pas de capture en $1, alors c'est un <a>...</a> ou attibuts // ref.: <a\b[^>]+>.*?</a>|</?\w+[^>]+> if (empty($capture[1])) unset($captures[$index]); // non-remplacement // sinon, c'est un mot du contenu: ref.: |\b(%s)\b else $captures[$index] = $capture[0]; // conserver seulement la capture 0 } // considérer la limite maximale de remplacements, -1 pour tous if ($limite > -1) $captures = array_slice($captures, 0, $limite); $count = count($captures); // retourner le nombre de remplacements fait // faire les remplacements selon le contenu restant de $captures // array_reverse permet de conserver les offsets valides pour subst_replace foreach (array_reverse($captures) as $capture) { $remplacer = sprintf('<a href="%s">%s</a>', $url, $capture[0]); // le mot capturé en 0 $html = substr_replace($html, $remplacer, $capture[1], // offset de remplacement en 1 strlen($capture[0])); } // retourer le HTML altéré return $html; } $text[0] = 'contenu photo tag contenu photo tag contenu photo tag contenu photo tag contenu photo tag contenu photo tag contenu photo tag contenu photo tag contenu photo tag'; $text[1] = '0'; $text[2] = 'contenu photo tag contenu photo tag contenu photo tag contenu photo tag contenu photo tag contenu photo tag contenu photo tag contenu photo tag contenu photo tag'; $text[3] = '0'; $text[4] = 'contenu photo tag contenu photo tag contenu photo tag contenu photo tag contenu photo tag contenu photo tag contenu photo tag contenu photo tag contenu photo tag'; $text[5] = '0'; $count = 0; // 15 remplacements max sur tous les morceaux, avec alternance <strong><em>. // passer les <a><strong><em> existants $occurrences = 15; foreach ($text as $index => $dummy) { if ($occurrences > 0) { $text[$index] = ajouter_tags($text[$index], 'contenu', array('strong', 'em'), $occurrences, $count); $occurrences -= $count; } } // 15 remplacements <strong> max sur tous les morceaux // passer les <a><strong> existants $occurrences = 15; foreach ($text as $index => $dummy) { if ($occurrences > 0) { $text[$index] = ajouter_tags($text[$index], 'contenu', array('strong'), $occurrences, $count); $occurrences -= $count; } } // 15 remplacements <a> max sur tous les morceaux // passer les <a> existants $occurrences = 15; foreach ($text as $index => $dummy) { if ($occurrences > 0) { $text[$index] = ajouter_lien($text[$index], 'photo', 'photo.php', $occurrences, $count); $occurrences -= $count; } } // voir le résultat HTML de ce qui précède echo '<pre>', print_r(array_map('htmlentities', $text), true), '</pre>'; ?>
Si les morceaux sur lesquels tu travailles sont à l'origine des textes pures comme ton exemple semble montrer, alors il est facile de les ramener dans un état pure texte.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 <?php $html = '<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> <strong>contenu</strong> <a href="photo.php">photo</a> <a href="tag.php">tag</a> <strong>contenu</strong> <a href="photo.php">photo</a> <a href="tag.php">tag</a> <strong>contenu</strong> <a href="photo.php">photo</a> <a href="tag.php">tag</a> <strong>contenu</strong> <a href="photo.php">photo</a> <a href="tag.php">tag</a> <strong>contenu</strong> <a href="photo.php">photo</a> <a href="tag.php">tag</a> <strong>contenu</strong> <a href="photo.php">photo</a> <a href="tag.php">tag</a> <strong>contenu</strong> <a href="photo.php">photo</a> <a href="tag.php">tag</a>'; echo preg_replace('@</?\w+[^>]*>@s', '', $html); ?>
Je croyais qu'on avais abandonné preg_replace_callback car tu la trouvais trop compliquée ?
Peu importe, la bonne implémentation d'une limite avec ce concept est plutôt.
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 public function mon_remplacement($html, $mot=false, $balise=false, $occurence=-1) { static $tag = null; static $count = 0; if (is_string($html) && is_string($mot) && is_string($balise)) { $tag = $balise; $count = $occurence; $regex = sprintf('@<%1$s\b[^>]*>.*?</%1$s>|</?[^>]+>|\b(%2$s)\b@si', $tag, $mot); return preg_replace_callback($regex, array($this, 'mon_remplacement'), $html); } if (is_array($html)) { if (!empty($html[1]) && $count) { $count--; return sprintf('<%1$s>%2$s</%1$s>', $tag, $html[1]); // ajouter } return $html[0]; // ne rien faire } return $html; }
Quand j'ai mis 15, c'était pour montrer que les 9 occurrences ne changeaient pas ( pour tag et photo, c'est le cas ) mais aussi que la deuxième balise ne s'appliquait plus :/
Donc oui, je veux que quand je mets 15, toutes les occurences soient changées mais la première fonction buggue à ce niveau. :/
Et non, je travaille pas sur du texte pur, il y aura déjà des balises :/
J'avais finalement compris hier, d'où mon message en début de cette page 4 La modification à ton code est aussi dans ce message. L'explication est simple, il n'est pas possible de repasser le paramètre $occurence à preg_replace_callback comme limite, car la fonction compte aussi les skips.
Je m'en doutais un peu
Est-ce qu'il y a des différences entre les tags clients et les tags ajoutés qui pourrait être exploitées?
Aurait tout de même le défaut de transformer (après les ajouts) un tag du client comme <strong>voiture</strong> en <em>voiture</em>.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 <?php $html = '<em><strong>voiture</strong></em>, <strong>voiture familiale</strong>, <strong class="vitale">voiture</strong>'; $regex = '@(?:<(em|strong)>)+(voiture)(?:</(?1)>)+@i'; echo preg_replace($regex, '$2', $html); ?>
Sur le tag <a>, est-ce qu'il y a un pattern dans le href qui pourrait être exploité?
Le dernier <a> sera tout de même détruit, sauf si tu as des aspects dans le href qui pourraient aider à différencier le <a> client du <a> qui a été ajouté. Dans un de tes messages tu semblais dire qu'il n'y a aucun <a> du client, est-ce toujours le cas?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 <?php $html = '<a href="ajout">voiture</a>, <a href="client">voiture familiale</a>, <a href="client">voiture</a>'; $regex = '@(?:<a href="[^"]+">)+(voiture)(?:</a>)+@i'; echo preg_replace($regex, '$1', $html); ?>
Sinon, il y a la facilité d'un marqueur. Au lieu de remplacer "voiture" en <strong>voiture</strong> faire <!--M--><strong>voiture</strong>, donc facile à retrouver. Si ce <!--M--> est bloquant dans l'optimisation, il y a aussi la possibilité d'ajouter un attribut comme dir="LTR" ou lang="fr", etc...
Approcherait un bon résultat.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 <?php $html = '<!--M--><a href="ajout">voiture</a>, <!--M--><em><!--M--><strong>voiture</strong></em>, <strong>voiture familiale</strong>, <strong class="vitale">voiture</strong>, <a href="client">voiture familiale</a>, une <strong>voiture</strong> du client <a href="client">voiture</a>'; $regex = '@(?:<!--M--><(a|em|strong)\b[^>]*>)+(voiture)(?:</(?1)>)+@i'; echo preg_replace($regex, '$2', $html); ?>
Bah en fait, si ya déjà un lien sur le mot voiture, ce n'est pas grave qu'il soit supprimé vu qu'il sera remplacé soit par le même lien soit par un nouveau lien contenu dans la BDD.
Ce qui serait gênant, c'est que la fonction supprimerait tous les liens ( même ceux qui ne sont pas associés à un mot clé )
Non, ce n'est pas un problème. On peut cibler sur le mot précis.
Par contre, s'il y a 3 liens avec "voiture", on ne peut pas tous les enlever si l'ajout est limité à 2. Car le dernier lien serait détruit.
Faut donc des destructions/ajouts synchonisés, pas de possibilité de nettoyage avant remplacement
Et pour les tags <em> et <strong>, c'est grave de transformer <strong>voiture</strong> en <em>voiture</em> ? Ça serait le seul cas limite à mon avis.
Non, je pense que ça irait.
Si déjà tout ça marche parfaitement, je serais heureux. Hier, j'ai bossé 10h d'affilée dessus sans trouver la solution.
Merci beaucoup :o
On commence à voir la lumière au bout du tunnel
J'ai modifié ajouter_lien().
Dans mon exemple, il y a 2 liens déjà existants <a href="client">tag</a> et je demande 3 remplacements maximum sur le mot "tag". Le résultat est 3 liens <a href="tag.php">tag</a> et 1 lien <a href="client">tag</a>... le premier lien a été changé (détruit/ajouté) car c'était le 2e mot "tag".
Avant de faire l'autre fonction avec alternance de tags, je veux être certaine que c'est bien ce que tu veux.
avant
après
Code : Sélectionner tout - Visualiser dans une fenêtre à part contenu photo tag contenu photo <a href="client">tag</a> contenu photo tag contenu photo tag contenu photo tag contenu photo tag contenu photo <a href="client">tag</a> contenu photo tag contenu photo tag
code
Code : Sélectionner tout - Visualiser dans une fenêtre à part contenu photo <a href="tag.php">tag</a> contenu photo <a href="tag.php">tag</a> contenu photo <a href="tag.php">tag</a> contenu photo tag contenu photo tag contenu photo tag contenu photo <a href="client">tag</a> contenu photo tag contenu photo tag
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 <?php function ajouter_lien($html, $mot, $url, $limite=-1, &$count=null) { // <a\b[^>]+>(%s)</a> tous liens contenant le mot exact (capturé en $1) $regex = sprintf('@<a\b[^>]+>(%s)</a>|', $mot); // <a\b[^>]+>.*?</a> tout autre lien pouvant contenir le mot (skip) $regex.= '<a\b[^>]+>.*?</a>|'; // </?\w+[^>]+> tout attribut pouvant contenir le mot (skip) $regex.= '</?\w+[^>]+>|'; // \b(%s)\b toutes les occurrences du mot dans le contenu (capturé en $2) $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 tag <a> existants $remplacements = array(); foreach ($captures as $index => $capture) { // si $capture[2] n'est pas vide, alors c'est le mot exact dans le contenu if (!empty($capture[2])) { $remplacements[] = array( 'mot' => $capture[2][0], // le mot 'offset' => $capture[2][1], // l'offset 'longueur' => strlen($capture[2][0]), // longueur ); } // si $capture[1] n'est pas vide, alors c'est un lien contenant le mot exact else if (!empty($capture[1])) { $remplacements[] = array( 'mot' => $capture[1][0], // le mot sans tags 'offset' => $capture[0][1], // l'offset avec le tag 'longueur' => strlen($capture[0][0]), // avec le tag ); } // 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 selon le contenu de $remplacements // array_reverse permet de conserver les offsets valides pour subst_replace foreach (array_reverse($remplacements) as $remplacement) { $remplacer = sprintf('<a href="%s">%s</a>', $url, $remplacement['mot']); $html = substr_replace($html, $remplacer, $remplacement['offset'], $remplacement['longueur']); } // retourer le HTML altéré return $html; } $test = 'contenu photo tag contenu photo <a href="client">tag</a> contenu photo tag contenu photo tag contenu photo tag contenu photo tag contenu photo <a href="client">tag</a> contenu photo tag contenu photo tag'; echo ajouter_lien($test, 'tag', 'tag.php', 3); ?>
test
avant
Code : Sélectionner tout - Visualiser dans une fenêtre à part echo ajouter_tags($test, 'tag', array('strong','em'), 4);
après
Code : Sélectionner tout - Visualiser dans une fenêtre à part contenu photo tag contenu photo <strong>tag</strong> contenu <strong>photo tag contenu</strong> photo <em><strong>tag</strong></em> contenu photo tag contenu photo tag contenu photo <strong>tag</strong> contenu photo tag contenu photo tag
code
Code : Sélectionner tout - Visualiser dans une fenêtre à part contenu photo <strong>tag</strong> contenu photo <em>tag</em> contenu <strong>photo tag contenu</strong> photo <strong>tag</strong> contenu photo <em>tag</em> contenu photo tag contenu photo <strong>tag</strong> contenu photo tag contenu photo tag
Bonne chance.
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
66
67
68 <?php function ajouter_tags($html, $mot, $balises, $limite=-1, &$count=null) { // extraction $tags = implode('|', $balises); // (?:<(?:%1$s)>)+(%2$s)(?:</(?:%1$s)>)+ toutes imbrications de tags (en $1) $regex = sprintf('@(?:<(?:%1$s)>)+(%2$s)(?:</(?:%1$s)>)+|', $tags, $mot); // <(%1$s)>.*?%2$s.*?</\2> tout autres tags contenant le mot (skip) $regex.= sprintf('<(%s)>.*?%s.*?</\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 tag <a> existants $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; } $test = 'contenu photo tag contenu photo <strong>tag</strong> contenu <strong>photo tag contenu</strong> photo <em><strong>tag</strong></em> contenu photo tag contenu photo tag contenu photo <strong>tag</strong> contenu photo tag contenu photo tag'; echo ajouter_tags($test, 'tag', array('strong','em'), 4); ?>
Hum merci encore, deux questions.
J'ai deux fonctions à la base, l'une qui alterne et l'autre qui n'alterne pas.
Je dois changer quoi dans ta fonction pour que ça les ajoute les deux ?
Et après si j'ai <strong><em>mot</em></strong>, je peux m'en sortir comment si je veux remplacer ces 2 balises par une h1 par exemple ?
Tu es comme des sables mouvants
Passer un array d'un seul élément dans le paramètre $balises, genre array('strong'), et l'alternance sera avec elle même.
Ajouter un paramètre pour inclure des tags sans qu'ils soient dans l'alternance ?
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
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
66
67
68 <?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); // <(%1$s)>.*?%2$s.*?</\2> tout autres tags contenant le mot (skip) $regex.= sprintf('<(a|%s)\b[^>]*>.*?%s.*?</\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 // exclurent ausssi 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; } $test = 'contenu photo <a href="#">tag</a> contenu photo <strong>tag</strong> contenu <strong>photo tag contenu</strong> photo <em><strong>tag</strong></em> contenu photo tag contenu photo tag contenu photo <strong>tag</strong> contenu photo tag contenu photo tag'; echo ajouter_tags($test, 'tag', array('h3'), 4, array('strong', 'em')); ?>
après
Code : Sélectionner tout - Visualiser dans une fenêtre à part contenu photo <a href="#">tag</a> contenu photo <strong>tag</strong> contenu <strong>photo tag contenu</strong> photo <em><strong>tag</strong></em> contenu photo tag contenu photo tag contenu photo <strong>tag</strong> contenu photo tag contenu photo tag
Mon inconscient avait une forte réticence avec h1, d'où h3
Code : Sélectionner tout - Visualiser dans une fenêtre à part contenu photo <a href="#">tag</a> contenu photo <h3>tag</h3> contenu <strong>photo tag contenu</strong> photo <h3>tag</h3> contenu photo <h3>tag</h3> contenu photo <h3>tag</h3> contenu photo <strong>tag</strong> contenu photo tag contenu photo tag
Finalement, mon intuition féminine pour une classe était la bonne Mais je ferai pas.
Bonne chance.
Désolé de te solliciter autant
Chuis vraiment pas doué
Bon, je teste ça et jte dis quoi :o
Je m'embrouille un peu là, si j'utilise ta dernière fonction, ce que tu me dis avant pour mettre deux balises sur un mot ne marchera plus car si j'appelle la fonction deux fois, il me mettra que la seconde ou j'ai raté quelque chose ?
Tu as un exemple ?
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