Précédent   Forum des professionnels en informatique > PHP > Langage > Regex
Regex Forum d'entraide sur les expressions rationnelles PHP. Avant de poster -> FAQ regex, Cours de regex et Sources de regex
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 15/09/2011, 20h18   #1
Membre à l'essai
 
Homme F. Mithieux
Étudiant
Inscription : juin 2008
Messages : 99
Détails du profil
Informations personnelles :
Nom : Homme F. Mithieux
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2008
Messages : 99
Points : 20
Points : 20
Par défaut Trouver un mot commençant par une lettre donnée

Bonsoir à tous,
Je viens vers vous ce soir, parce que je sèche sérieusement ^^.
Après plusieurs tentatives, je n'arrive pas à trouver comment, en expression régulière, trouver un mot commençant par une certaine lettre.

Je m'explique:
Mon but est de lister tous les mots d'une chaine, contenant en tant que première lettre un "p" par exemple. Cela comprend bien sûr le premier mot d'une chaîne, ainsi que tous les autres...

Donc voilà, j'ai tenté plusieurs choses, dont celle que je vous présente ci-dessous, sans vraiment de succès :/.

Code :
1
2
3
4
5
6
		$preg = preg_match("(".$lettreMini."[a-zA-Z]{3,}|".$lettreMaxi."[a-zA-Z]{3,})", $row->titre, $matches);
		if($preg){
		    echo "Ok !";
		}else{
		    echo "Non ok.";
		}

Je remercie d'avance toute personne qui pourra m'aider .
Arget est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/09/2011, 14h42   #2
Membre à l'essai
 
Homme F. Mithieux
Étudiant
Inscription : juin 2008
Messages : 99
Détails du profil
Informations personnelles :
Nom : Homme F. Mithieux
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2008
Messages : 99
Points : 20
Points : 20
Ne trouvant pas de solution, je vais passer par le bidouillage ^^:

Je vais faire un coup de explode d'espaces pour avoir un tableau regroupant tous les mots de ma chaîne, et je ferais ma vérification en parcourant ce tableau ^^.

Si vous avez une autre solution, je reste à votre écoute, et suis toujours preneur .



Edit:
Voilà, en gros, ça donnera quelque chose comme ça:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
$array = array();
$mots = array();
 
$mots = explode(" ", $row->titre);
		$taille = sizeof($mots);
		for($i = 0; $i < $taille; $i++){
 
		    $search = '(^'.$lettreMini.'[a-zA-Z]{3,}|^'.$lettreMaxi.'[a-zA-Z]{3,})';
 
		    if(preg_match($search, $mots[$i], $matches)){
 
			array_push($array, $mots[$i]);
 
		    }
 
		}
 
	    }
 
	    return $array;
Arget est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/09/2011, 16h28   #3
Modératrice
 
Avatar de Celira
 
Femme
Développeuse PHP/Java
Inscription : avril 2007
Messages : 3 661
Détails du profil
Informations personnelles :
Sexe : Femme
Âge : 27
Localisation : France

Informations professionnelles :
Activité : Développeuse PHP/Java

Informations forums :
Inscription : avril 2007
Messages : 3 661
Points : 5 388
Points : 5 388
En se basant sur la même chose, on peut chercher tous les mots précédés par un espace qui commencent par la lettre (en ajoutant un espace au début de la chaine pour gérer le premier mot) et utilisant preg_match_all.
Code :
1
2
3
4
5
$matches = array();
$chaine = ' '.$chaineATester;
if (preg_match_all("#(\s".$lettre."[\w]*)#i", $chaine, $matches) !== false) {
  echo 'trouves : '.implode(', ', $matches[1]);
}
__________________
Modératrice PHP
Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)

Pour afficher votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur)
Celira est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/09/2011, 17h32   #4
Rédacteur
 
Avatar de jreaux62
 
Homme Jérôme Réaux
Webdesigner
Inscription : août 2008
Messages : 2 994
Détails du profil
Informations personnelles :
Nom : Homme Jérôme Réaux
Âge : 45
Localisation : France, Pas de Calais (Nord Pas de Calais)

Informations professionnelles :
Activité : Webdesigner
Secteur : Arts - Culture

Informations forums :
Inscription : août 2008
Messages : 2 994
Points : 5 787
Points : 5 787
Envoyer un message via Skype™ à jreaux62
Bonjour Celira,
une légère correction à ton code :
Citation:
$regex_mot = "#\s(".$lettre."[\w-]*)#ui";
( -> déplacé (pour ne pas inclure l'espace dans les résultats)
- -> pour les mots composés (facultatif)
u -> car sans, j'ai constaté des soucis avec certains accents.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
<?php
$chaineATester = 'Père-Noël est un papa-poule poète, un bête pépère pâle qui pue qui pète près du poêle.';
echo $chaineATester.'<br /><br />';
 
$lettre = 'p';
 
$regex_mot = "#\s(".$lettre."[\w-]*)#ui";
$matches = array();
if (preg_match_all($regex_mot, ' '.$chaineATester, $matches) !== false) {
	echo '-> "'.implode('", "', $matches[1]).'"';
}
?>
Citation:
Père-Noël est un papa-poule poète, un bête pépère pâle qui pue qui pète près du poêle.

-> "Père-Noël", "papa-poule", "poète", "pépère", "pâle", "pue", "pète", "près", "poêle"
Sans mettre u dans la regex, j'obtiens ca :
Citation:
-> "P�", "papa-poule", "po�", "p�", "p�", "pue", "p�", "pr�", "poêle"
(pas tous les accents ?! bizarre...)

ps : encodage utf-8 (sans BOM)
__________________
"Ce qui se conçoit bien s'énonce clairement - Et les mots pour le dire arrivent aisément."
Nicolas Boileau-Despréaux, Homme de lettres français (1636-1711), principal théoricien de l'esthétique classique.
Site perso Mes tutos DVP : Gestion-Affichage de Nouvelles - Affichage en tableau HTML - Fonctions de redimensionnement d'images
jreaux62 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/09/2011, 18h00   #5
Membre à l'essai
 
Homme F. Mithieux
Étudiant
Inscription : juin 2008
Messages : 99
Détails du profil
Informations personnelles :
Nom : Homme F. Mithieux
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2008
Messages : 99
Points : 20
Points : 20
Ah oui, excellente idée l'espace avant la chaîne !
Bon du coup, étant déjà parti sur la base que j'ai décrite précédemment, je vais continuer avec, mais j'y penserais à l'avenir, c'est certain !

Merci beaucoup pour vos réponses en tout cas !
Arget est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/09/2011, 18h08   #6
Rédacteur
 
Avatar de jreaux62
 
Homme Jérôme Réaux
Webdesigner
Inscription : août 2008
Messages : 2 994
Détails du profil
Informations personnelles :
Nom : Homme Jérôme Réaux
Âge : 45
Localisation : France, Pas de Calais (Nord Pas de Calais)

Informations professionnelles :
Activité : Webdesigner
Secteur : Arts - Culture

Informations forums :
Inscription : août 2008
Messages : 2 994
Points : 5 787
Points : 5 787
Envoyer un message via Skype™ à jreaux62
Tu as raison,
rien de tel qu'une bonne usine à gaz

Utilise au moins foreach (et sors $search de la boucle) :
Code php :
1
2
3
4
5
6
7
8
9
10
11
$array = array();
$mots = array();
 
$mots = explode(" ", $row->titre);
$search = '(^'.$lettreMini.'[a-zA-Z]{3,}|^'.$lettreMaxi.'[a-zA-Z]{3,})';
 
	foreach($mots as $i => $mot){
		if(preg_match($search, $mot, $matches)){
			array_push($array, $mot);
		}
	}
__________________
"Ce qui se conçoit bien s'énonce clairement - Et les mots pour le dire arrivent aisément."
Nicolas Boileau-Despréaux, Homme de lettres français (1636-1711), principal théoricien de l'esthétique classique.
Site perso Mes tutos DVP : Gestion-Affichage de Nouvelles - Affichage en tableau HTML - Fonctions de redimensionnement d'images
jreaux62 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/09/2011, 18h50   #7
Modérateur
 
Inscription : septembre 2010
Messages : 7 131
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 131
Points : 8 491
Points : 8 491
un array_push piur 1 seul insere est inutile utilise plutôt
$array[] = $mot, pour le groupe a-zA-Z plutot prendre le \pL si on bosse avec le l'utf-8, le pas oublier non plus que la limite de mot en pcre c'est le \b
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/09/2011, 17h41   #8
Membre à l'essai
 
Homme F. Mithieux
Étudiant
Inscription : juin 2008
Messages : 99
Détails du profil
Informations personnelles :
Nom : Homme F. Mithieux
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2008
Messages : 99
Points : 20
Points : 20
Merci pour tous ces conseils . Je vais reprendre le code du coup ^^
Arget est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h44.


 
 
 
 
Partenaires

Hébergement Web