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 03/08/2011, 15h19   #1
Membre du Club
 
Homme
Consultant informatique
Inscription : août 2007
Messages : 128
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Allemagne

Informations professionnelles :
Activité : Consultant informatique

Informations forums :
Inscription : août 2007
Messages : 128
Points : 54
Points : 54
Par défaut And en expression reguliere

Salut tout le monde,

Je ne m y connais pas en Expression reguliere. quelqu'un pourrait m'aider. Je voudrais trouver dans un Text: luft "and" fracht c-a-d dans un Text où il ya luft et fracht.

Exemple de Text: luft Expand to see a description of the current regular expression. Right-click a node to edit the expression fracht.

je devrais trouver les deux mots.

Comment je fais? merci pour les reponses
mourbare est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/08/2011, 16h29   #2
Futur Membre du Club
 
Femme
Étudiant
Inscription : janvier 2011
Messages : 17
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Arts - Culture

Informations forums :
Inscription : janvier 2011
Messages : 17
Points : 17
Points : 17
Bonjour,

Si tu n'as besoin que de la forme de la regex (et pas du code PHP), tu pourrais essayer ceci :

Code :
^.*(luft)?.*(fracht)?.*$
Voici le détail :
^ : début de la phrase
.* : n'importe quoi
(luft)? : 0 ou 1 fois "luft"
.* : n'importe quoi
(fracht)? : 0 ou 1 fois "fracht"
.* : n'importe quoi
$ : fin de la phrase
wazokivol est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/08/2011, 16h38   #3
Membre Expert
 
Avatar de David Guillot
 
Homme David Guillot
Chef de projet en SSII
Inscription : mars 2004
Messages : 879
Détails du profil
Informations personnelles :
Nom : Homme David Guillot
Âge : 28
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Chef de projet en SSII
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : mars 2004
Messages : 879
Points : 1 149
Points : 1 149


Attention, la solution de wazokivol ne fonctionne que si tes 2 mots sont toujours dans le même ordre dans ta phrase... Je suis en train de chercher (ça m'entraîne aux RegEx), je te dis quand j'ai trouvé un truc...
__________________
Avant de poser une question ici :

Après résolution de votre question : un clic sur , un et un vote pour les personnes qui vous ont aidé
David Guillot est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/08/2011, 16h47   #4
Membre Expert
 
Avatar de David Guillot
 
Homme David Guillot
Chef de projet en SSII
Inscription : mars 2004
Messages : 879
Détails du profil
Informations personnelles :
Nom : Homme David Guillot
Âge : 28
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Chef de projet en SSII
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : mars 2004
Messages : 879
Points : 1 149
Points : 1 149
En fait il suffit de faire un OU entre les 2 possibilités :
(luft puis fracht) OU (fracht puis luft)

Ce qui donne :
Code :
1
2
3
4
5
6
7
8
9
10
11
$texts = array(
	'luft and fracht'	=> '',
	'fracht and luft'	=> '',
	'luft and luft'		=> '',
	'luft and plouf'	=> '',
	'plouf'			=> '',
);
foreach($texts as $text=>&$result) {
	$result = preg_match('`(fracht.*luft)|(luft.*fracht)`', $text, $matches);
}
die('<pre>'.print_r($texts, TRUE).'</pre>');
__________________
Avant de poser une question ici :

Après résolution de votre question : un clic sur , un et un vote pour les personnes qui vous ont aidé
David Guillot est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 03/08/2011, 17h00   #5
Modérateur
 
Inscription : septembre 2010
Messages : 7 107
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 107
Points : 8 455
Points : 8 455
il faut mettre la limite de mot \b, sinon si un mot contient la chaine il sera matcher

je te déconseille d’utiliser l'opérateur d’exécution comme delimiter
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 03/08/2011, 17h07   #6
Membre du Club
 
Homme
Consultant informatique
Inscription : août 2007
Messages : 128
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Allemagne

Informations professionnelles :
Activité : Consultant informatique

Informations forums :
Inscription : août 2007
Messages : 128
Points : 54
Points : 54
Citation:
Envoyé par torvalds17 Voir le message
En fait il suffit de faire un OU entre les 2 possibilités :
(luft puis fracht) OU (fracht puis luft)

Ce qui donne :
Code :
1
2
3
4
5
6
7
8
9
10
11
$texts = array(
	'luft and fracht'	=> '',
	'fracht and luft'	=> '',
	'luft and luft'		=> '',
	'luft and plouf'	=> '',
	'plouf'			=> '',
);
foreach($texts as $text=>&$result) {
	$result = preg_match('`(fracht.*luft)|(luft.*fracht)`', $text, $matches);
}
die('<pre>'.print_r($texts, TRUE).'</pre>');
Merci beaucoups pour vos contributions. la solution propose par @torvalds17 fonctionne mais mon probleme devient malheureusement complexe: si je me retrouve avec "luft and fracht and sicherheit and ...." il me faut faire une permutation entre les mots pour obtenir les expressions regulieres.
mourbare est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/08/2011, 17h27   #7
Rédacteur
 
Avatar de jreaux62
 
Homme Jérôme Réaux
Webdesigner
Inscription : août 2008
Messages : 2 993
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 993
Points : 5 786
Points : 5 786
Envoyer un message via Skype™ à jreaux62
Citation:
Envoyé par mourbare Voir le message
si je me retrouve avec "luft and fracht and sicherheit and ...." il me faut faire une permutation entre les mots pour obtenir les expressions regulieres.
Hello,
je me suis justement intéressé à la question pas plus tard que ... maintenant (en lisant ce post !)
(les regex ne sont pas mon fort, c'est donc une bonne occasion de s'y mettre !)

J'ai trouvé une solution (qui n'est peut-être pas la meilleur, mais qui semble fonctionner) :
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
<html>
<head>
</head>
<body>
<?php
// array des mots a rechercher
$lesmotsrecherches = array(
	'luft',
	'bla',
	'fracht'
);
 
// array "test"
$texts = array(
	'luft - fracht'	=> '',
	'luft - plouf - fracht'	=> '',
	'fracht - luft - luft'	=> '',
	'luft - luft'		=> '',
	'luft - plouf'	=> '',
	'luft - blabla - fracht'	=> '',
	'luft - bla - fracht'	=> '',
	'luft - fracht - bla'	=> '',
	'luft - plouf - bla'	=> '',
	'fracht - bla - fracht - luft'	=> '',
	'plouf'			=> '',
);
?>
 
<p>recherche TOUS les mots :</p>
<?php
foreach($texts as $text=>&$result) {
 
	// recherche TOUS les mots : 
	// si tous bons, on obtient 1  : (1 * 1 * 1 * 1 * ...) = 1
	// si au moins un est mauvais, on obtient 0  : (1 * 0 * 1 * 1 * ...) = 0
	$result = 1;
	foreach($lesmotsrecherches as $lemot) {
		$result *= preg_match('/^.*\b'.$lemot.'\b.*/', $text, $matches);
	}
 
}
echo('<pre>'.print_r($texts, TRUE).'</pre>');
?>
 
<p>recherche AU MOINS UN des mots :</p>
<?php
foreach($texts as $text=>&$result2) {
 
	// recherche AU MOINS UN des mots :
	$result2 = 0;
	foreach($lesmotsrecherches as $lemot) {
		$result2 += preg_match('/^.*\b'.$lemot.'\b.*/', $text, $matches);
		$result2 = ($result2>0)? 1 : 0;
	}
 
}
echo('<pre>'.print_r($texts, TRUE).'</pre>');
?>
</body>
</html>
On obtient (apparemment) les bons résultats :
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
recherche TOUS les mots :
 
Array
(
    [luft - fracht] => 0
    [luft - plouf - fracht] => 0
    [fracht - luft - luft] => 0
    [luft - luft] => 0
    [luft - plouf] => 0
    [luft - blabla - fracht] => 0
    [luft - bla - fracht] => 1
    [luft - fracht - bla] => 1
    [luft - plouf - bla] => 0
    [fracht - bla - fracht - luft] => 1
    [plouf] => 0
)
 
recherche AU MOINS UN des mots :
 
Array
(
    [luft - fracht] => 1
    [luft - plouf - fracht] => 1
    [fracht - luft - luft] => 1
    [luft - luft] => 1
    [luft - plouf] => 1
    [luft - blabla - fracht] => 1
    [luft - bla - fracht] => 1
    [luft - fracht - bla] => 1
    [luft - plouf - bla] => 1
    [fracht - bla - fracht - luft] => 1
    [plouf] => 0
)
__________________
"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 10
Vieux 04/08/2011, 16h52   #8
Membre du Club
 
Homme
Consultant informatique
Inscription : août 2007
Messages : 128
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Allemagne

Informations professionnelles :
Activité : Consultant informatique

Informations forums :
Inscription : août 2007
Messages : 128
Points : 54
Points : 54
Citation:
Envoyé par jreaux62 Voir le message
Hello,
je me suis justement intéressé à la question pas plus tard que ... maintenant (en lisant ce post !)
(les regex ne sont pas mon fort, c'est donc une bonne occasion de s'y mettre !)

J'ai trouvé une solution (qui n'est peut-être pas la meilleur, mais qui semble fonctionner) :
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
<html>
<head>
</head>
<body>
<?php
// array des mots a rechercher
$lesmotsrecherches = array(
	'luft',
	'bla',
	'fracht'
);
 
// array "test"
$texts = array(
	'luft - fracht'	=> '',
	'luft - plouf - fracht'	=> '',
	'fracht - luft - luft'	=> '',
	'luft - luft'		=> '',
	'luft - plouf'	=> '',
	'luft - blabla - fracht'	=> '',
	'luft - bla - fracht'	=> '',
	'luft - fracht - bla'	=> '',
	'luft - plouf - bla'	=> '',
	'fracht - bla - fracht - luft'	=> '',
	'plouf'			=> '',
);
?>
 
<p>recherche TOUS les mots :</p>
<?php
foreach($texts as $text=>&$result) {
 
	// recherche TOUS les mots : 
	// si tous bons, on obtient 1  : (1 * 1 * 1 * 1 * ...) = 1
	// si au moins un est mauvais, on obtient 0  : (1 * 0 * 1 * 1 * ...) = 0
	$result = 1;
	foreach($lesmotsrecherches as $lemot) {
		$result *= preg_match('/^.*\b'.$lemot.'\b.*/', $text, $matches);
	}
 
}
echo('<pre>'.print_r($texts, TRUE).'</pre>');
?>
 
<p>recherche AU MOINS UN des mots :</p>
<?php
foreach($texts as $text=>&$result2) {
 
	// recherche AU MOINS UN des mots :
	$result2 = 0;
	foreach($lesmotsrecherches as $lemot) {
		$result2 += preg_match('/^.*\b'.$lemot.'\b.*/', $text, $matches);
		$result2 = ($result2>0)? 1 : 0;
	}
 
}
echo('<pre>'.print_r($texts, TRUE).'</pre>');
?>
</body>
</html>
On obtient (apparemment) les bons résultats :
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
recherche TOUS les mots :
 
Array
(
    [luft - fracht] => 0
    [luft - plouf - fracht] => 0
    [fracht - luft - luft] => 0
    [luft - luft] => 0
    [luft - plouf] => 0
    [luft - blabla - fracht] => 0
    [luft - bla - fracht] => 1
    [luft - fracht - bla] => 1
    [luft - plouf - bla] => 0
    [fracht - bla - fracht - luft] => 1
    [plouf] => 0
)
 
recherche AU MOINS UN des mots :
 
Array
(
    [luft - fracht] => 1
    [luft - plouf - fracht] => 1
    [fracht - luft - luft] => 1
    [luft - luft] => 1
    [luft - plouf] => 1
    [luft - blabla - fracht] => 1
    [luft - bla - fracht] => 1
    [luft - fracht - bla] => 1
    [luft - plouf - bla] => 1
    [fracht - bla - fracht - luft] => 1
    [plouf] => 0
)
Merci beaucoups pour ce coups de main genial.
mourbare 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 12h29.


 
 
 
 
Partenaires

Hébergement Web