Bonjour,

J'ai un gros texte ou j'aimerais en extraire qu'une partie selon le terme recherché. Ci dessous, une partie du code que j'utilise..

les variables connues :

$keywords : le terme recherché...
$texte : un texte de ~16'000 caractères
$description : résumé du texte sur un peu près 350 caractères (synopsis)

Si la variable $keywords comporte qu'un seul terme, mon exemple ci-dessous fonctionne, il va afficher ma keywords et 320 caractères à gauche de celui ci et également à droite

Par contre si j'ai deux termes dans ma variable $keywords il m'affiche uniquement la desciption et c'est pas ce que je souhaite... si les deux termes recherchés sont trop éloignés dans le texte (ce qui arrivera forcément..) qu'il en prenne au moins un des deux termes pour afficher 320 caractères à gauche de celui ci et également à droite..

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
<?php
 
 // Nettoyage...
 
	$keywords = htmlentities(htmlspecialchars($_GET['s'], ENT_COMPAT)); 
	$keywords = trim(strip_tags($keywords));
	$keywords = html_entity_decode($keywords);
 
	$keywordUnclean = trim(preg_replace("/&#?[a-z0-9]+;/i",'',(strip_tags($keywords))));
	$keywordClean = substr(preg_replace('/\s+/', ' ', $keywordUnclean), 0, 255);
 
// +---------- Transfo pour surlignage ---------------+
 
	$keywords3 = explode(' ', $keywordClean);	
 
// +---------- Le premier mot clef de plus de 4 lettres est gardé pour le positionner dans le texte ---------------+	  
 
	$wordsy    = array_filter(explode('+', $keywords), function($p) { return strlen($p) > 4; });
	$keyword2  = reset($wordsy);
 
// +---Connexion à ma bd et tout le tralala ----- +
 
//..................................
 
// +------  Cherche les keywords qui sont présent dans le texte ----------- +	
 
		$pos = stripos($texte, $keyword2); // insensible à la casse, sinon strpos
		if ($pos === false) {
		$decription = "$description";
		} else {
		$description = "$texte";
        }
 
		$texte = str_replace(array("\r\n", "\n", "\n\r"), ' ', $texte);
 
		$i = stripos($texte, $keyword2);
		if ($i <= 320)
			{
				$r = substr($texte, 0, $i);
			}
		else
			{
    // par la gauche
		$lim = -320;
		while (substr($texte, $i + $lim--, 1) !== ' ') // coupure sur le premier espace trouvé
			{
        continue;
			}
		$r  = substr($texte, $i + $lim + 2, abs($lim) - 2);
			}
 
		$start = $i + strlen($keyword2);
		if (($start + 320) >= strlen($texte))
			{
		$r .= substr($texte, $i);
		}
		else
		{
    // par la droite
		$lim = 320;
		while (substr($texte, $start + $lim++, 1) !== ' ')
			{
        continue;
			}
		$r .= substr($texte, $i, --$lim + strlen($keyword2));
		}
 
		$description ="$r";
 
 
// +-------------- je prépare pour la mise en gras -----------+
 
		$motif='`\b(('.implode('|',$keywords3).')s?)\b`si';
		$sortie='<span class="highlight_word">$1</span>';
		$sortie2='<span class="highlight_word2">$1</span>'; // question de couleur par rapport à $sortie
		$texte = preg_replace($motif,$sortie,$texte);
		$nomsite = preg_replace($motif,$sortie2,$nomsite);
		$description = preg_replace($motif,$sortie,$description);
	?>
J'espère avoir été clair dans mon explication (pas évident j'en conviens..)

D'avance merci de m'éclairer sur mon problème
Yule