Trouvé un mot dans une variable plus les premiers et derniers caractères

WRInaute occasionnel
Bonjour,

Avec ce bout de script ci-dessous, j'aimerais arriver à 4 choses

1) ne prendre en considération dans la valeur $keyword, que le premier mot de plus de 4 lettres (donc ne pas tenir compte de "le, la , sa etc..)
2) selon la position ou le terme est trouvée dans le texte.. affiche les 30 premiers caractères avant ce terme et les 20 suivants (selon $pos)
3) devrait afficher ceci "avancée outils linguistiques le domaine google.ch est disponible" (en prenant que des mots entier dans la découpe...)
4) si il n'y a pas 30 caractères avant ou 20 après, récupérer les 50 (30+20) avant ou après le keywords

Code:
<?php header('Content-type: text/html; charset=utf-8');

$texte ="Google recherche images maps play youtube actualités gmail drive plus » historique web | paramètres | connexion × surfez encore plus vite installer google chrome suisse * 
recherche avancée outils linguistiques le domaine google.ch est disponible en : deutsch english italiano rumantsch solutions publicitaires solutions..";

$keyword = "le+domaine+de+sa+vigne"; // devrait prendre en compte que "domaine"... les plus (+) viennent de ma recherche, les espaces sont remplacés par des +

$termes = explode("+", $keyword);
echo $termes[0] , "<BR>"; // le
echo $termes[1] , "<BR>"; // domaine
echo $termes[2] , "<BR>"; // de
echo $termes[3] , "<BR>"; // sa
echo $termes[4] , "<BR>"; // vigne
echo $termes[5] , "<BR>"; // Rien
echo $termes[6] , "<BR>"; // Rien

// comment récupérer le premier termes d'au moins 4 caractères ? => domaine

//Je cherche la position
$pos = strpos($texte, $keyword);

if ($pos === false) {
    echo "La chaîne '$keyword' ne se trouve pas dans la chaîne <br><br>'$texte'";
} else {
    echo "La chaine '$keyword' a été trouvée dans la chaîne <br><br>'$texte'";
    echo " et débute à la position $pos"; // position 220
	
}

?>

je dois travailler à mon avis avec strrpos et substr mais dans les exemples, j'ai pas trouvé mon bonheur.

D'avance merci de m'éclairer
Bonne après-midi
Yule
 
Nouveau WRInaute
Bonjour,

Pour effectuer votre recherche de mot, je vous suggère d'utiliser la fonction PREG_SPLIT et de découper votre variable selon les espaces entre les mots.
avec une boucle, vous passez chaque mot ainsi trouvé et gardez le premier qui répond à vos critères.
Avec STRIPOS, vous aurez la position du mot récupéré juste avant, donc vous saurez s'il y a 30 caractères avant. pour les 20 après, longueur total de la variable moins la position du mot et sa longueur.
Enfin pour récupérer vos chaines de 30 et 20 caractères, la fonction SUBSTR est là pour ça.

En espérant vous avoir aidé.

Sushih69
 
WRInaute occasionnel
Bonjour,

Merci ça m'aiguille et selon votre explication, ça l'air bien plausible.
Je dois également tenir compte de mettre en surbrillance le terme recherché, donc ça fait trop d'inconnu pour mes connaissances en php. je vais mettre de coté ce choix sur mon moteur.. je pense qu'il faut que j'aille par étape pour développer ça
et que je regarde comment faire point par point

Merci
Yule
 
WRInaute occasionnel
j'arrive pas lacher.. rire

j'en suis à ce stade.... Le echo est pour que je comprenne ce qu'il s'affiche...

Code:
$texte ="Google recherche images maps play youtube actualités gmail drive plus » historique web | paramètres | connexion × surfez encore plus vite installer google chrome suisse   
recherche avancée outils linguistiques le domaine google.ch est disponible en : deutsch english italiano rumantsch solutions publicitaires solutions..";

$keyword = "le+domaine+de+sa+vigne";

//+ --- je récupère le premier mot avec 4 caractères minimum

$termes = explode("+", $keyword);
 
$terme_ok = null;
foreach($termes as $terme) {

    if (strlen($terme) > 4) {
        $terme_ok = $terme;
        break;
    }
}

echo "$terme_ok<br><br>"; // $terme_ok est le premier mot de plus de 4 lettres

//Je cherche la position de ce mot de 4 caractères minimum

$pos = stripos($texte, $terme_ok); // insensible à la casse, sinon strpos
if ($pos === false) {
    echo "Le terme '$terme_ok' ne se trouve pas dans la chaîne texte";
} else {
    echo "Le terme '$terme_ok' a été trouvée dans la chaîne texte<br><br>";
    echo " Le terme '$terme_ok' débute à la position $pos <br><br>"; // position 220
}

// domaine
// Le terme 'domaine' a été trouvée dans la chaîne texte
// Le terme 'domaine' débute à la position 220


Comment afficher les 30 caractères précédant ce terme "domaine" et les 20 suivants pour y afficher avec une découpe sur des mots entiers "avancée outils linguistiques le domaine google.ch est disponible"

IMPORTANT: il faudrait également prendre en compte que s'il n'y pas de 30 caractères avant ou 20 après, qu'il prennent en plus du terme "domaine" les 50 caractères le précédant ou les 50 caractères suivant

Code:
$max=30;
if(strlen($texte)>=$max){$texte=substr($texte,0,$max);
$espace=strrpos($texte," ");
$texte=substr($texte,0,$espace)."..."; }
echo $texte;

Il m'affiche ceci "Google recherche images maps..." . Je ne sais pas comment me positionner selon la valeur $pos pour couper au bon endroit...

A+
Yule
 
WRInaute occasionnel
Re,

j'avance mais c'est de plus en plus misérable (malgré tout et pour pas relire tout le poste, je résume la situation)

Ce qui fonctionne et qui à l'air optimum...

Code:
$texte ="Google recherche images maps play youtube actualités gmail drive plus » historique web | paramètres | connexion × surfez encore plus vite installer google chrome suisse * 
recherche avancée outils linguistiques le domaine google.ch est disponible en : deutsch english italiano rumantsch solutions publicitaires solutions..";

$keyword = "le+domaine+de+sa+vigne";

//+ --- je récupère le premier mot avec 4 caractères minimum

$words    = array_filter(explode('+', $keyword), function($p) { return strlen($p) > 4; });
$word     = reset($words);

echo "$word<br><br>"; // $word est le premier mot de plus de 4 lettres => domaine

//Je cherche la position de ce mot de 4 caractères minimum

$pos = stripos($texte, $word); // insensible à la casse, sinon strpos
if ($pos === false) {
    echo "Le terme '$word' ne se trouve pas dans la chaîne texte";
} else {
    echo "Le terme '$word' a été trouvée dans la chaîne texte<br><br>";
    echo " Le terme '$word' débute à la position $pos <br><br>"; // position 220
}

// domaine
// Le terme 'domaine' a été trouvée dans la chaîne texte
// Le terme 'domaine' débute à la position 220

Maintenant avec ce qui précède, je dois afficher les 170 caractères précédant ce $word "domaine" et les 170 suivants pour y afficher avec une découpe sur des mots entiers

Le résultat espéré => gmail drive plus » historique web | paramètres | connexion × surfez encore plus vite installer google chrome suisse recherche avancée outils linguistiques le domaine google.ch est disponible en : deutsch english italiano rumantsch solutions publicitaires solutions.

IMPORTANT: il faudrait également prendre en compte que s'il n'y pas de 170 caractères avant ou 170 après $word et sa position ($pos), qu'il prennent en plus du $word "domaine" les 240 caractères le précédant ou les 240 caractères suivant

J'arrive qu'à ça (pathétique..:oops:)


Code:
// afficher 170 caractère après $word
$pos=$pos-1;
$start = $pos;
$length = 170;
$result = substr ($texte, $start, $length);


echo"$result <br><br>";
//[color=#FF0000]domaine [/color]google.ch est disponible en : deutsch english italiano rumantsch solutions publicitaires solutions


// Afficher 170 caractères avant $word

$decompte = strlen($word); //7
$v=$length-$décompte; // 170-7 = 163
$x2=$pos-$v-1;  //220-163-1 = 58 (nouvelle position..)
$start = $x2; // 58
$result2 = substr ($texte, $start, $length);
echo"$result2 <br><br>";
// ités gmail drive plus » historique web | paramètres | connexion × surfez encore plus vite installer google chrome suisse recherche avancée outils linguistiques le

echo"$result2$result <br><br>";
//ités gmail drive plus » historique web | paramètres | connexion × surfez encore plus vite installer google chrome suisse recherche avancée outils linguistiques le [color=#FF0000]domaine [/color]google.ch est disponible en : deutsch english italiano rumantsch solutions publicitaires solutions

=> ités gmail drive plus » historique web | paramètres | connexion × surfez encore plus vite installer google chrome suisse recherche avancée outils linguistiques le domaine google.ch est disponible en : deutsch english italiano rumantsch solutions publicitaires solutions

Ça ne coupe pas proprement, ça ne prend pas en compte s'il y a assez de caractères avant et après $word et c'est surtout, pas du tout optimum arghhhhhh

J'essaye mais ça va pas....

A+
Yule
 
Discussions similaires
Haut