Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

preobleme de regexp

7 réponses
Avatar
newdb
bonjour,

je voudrai remplacer mon code str_replace (qui fonctionne) :

$ligne =
"des mots qui_varient('truc','bidule','machin_01','chose','');";

$extrait =
str_replace(array("des mots qui_varient","(",")","'",";"),"",$ligne);

$partie =
explode(",",$extrait);

$var_1 = trim($partie[0]);
$var_2 = trim($partie[1]);
$var_3 = trim($partie[2]);
$var_4 = trim($partie[3]);
$var_5 = trim($partie[4]);


par une regexp (plus générique) qui serait donc :

ne conserver de $ligne que ce qui se trouve entre les parenthèses
et en oter les apostrophes.

merci à qui pourra m'aiguiller vers une solution.


--
@@@@@
E -00 comme on est very beaux dis !
' `) /
|\_ =="

7 réponses

Avatar
Olivier Miakinen

je voudrai remplacer mon code str_replace (qui fonctionne) :

$ligne > "des mots qui_varient('truc','bidule','machin_01','chose','');";

$extrait > str_replace(array("des mots qui_varient","(",")","'",";"),"",$ligne);

$partie = explode(",",$extrait);

$var_1 = trim($partie[0]);
[...]
$var_5 = trim($partie[4]);

par une regexp (plus générique) qui serait donc :

ne conserver de $ligne que ce qui se trouve entre les parenthèses
et en oter les apostrophes.


Peut-il y avoir des apostrophes dans « des mots qui_varient » ?

Si la réponse est non, tu peux faire tout simplement :
preg_match_all("'[^']*'", $ligne, $matches [ , flags ]);

Si la réponse est oui, alors tu peux faire un premier preg_match qui te
donne le contenu des parenthèses, suivi par celui que je donne ci-dessus.

Par ailleurs, pour avoir la fonctionnalité du trim(), tu peux faire :
preg_match_all("'[ t]*([^']*)[ t]*'", $ligne, $matches [ , flags ]);


Cordialement,
--
Olivier Miakinen
Troll du plus sage chez les conviviaux : le nouveau venu, avec
son clan, s'infiltre dans les groupes de nouvelles. (3 c.)

Avatar
newdb
Olivier Miakinen <om+ wrote:
je voudrai remplacer mon code str_replace (qui fonctionne) :
par une regexp (plus générique) qui serait donc :
ne conserver de $ligne que ce qui se trouve entre les parenthèses
et en oter les apostrophes.


Peut-il y avoir des apostrophes dans « des mots qui_varient » ?
Si la réponse est non, tu peux faire tout simplement :
preg_match_all("'[^']*'", $ligne, $matches [ , flags ]);
Si la réponse est oui, alors tu peux faire un premier preg_match qui te
donne le contenu des parenthèses, suivi par celui que je donne ci-dessus.
Par ailleurs, pour avoir la fonctionnalité du trim(), tu peux faire :
preg_match_all("'[ t]*([^']*)[ t]*'", $ligne, $matches [ , flags ]);



bonjour,
et merci.

alors :
en modifiant un poil (ajout des / et / comme délimiteurs dans le filtre
de recherche), sous peine de :
Warning: preg_match_all(): Unknown modifier ']' in essai1.php on line 3

donc avec :
preg_match_all( "/'[ t]*([^']*)[ t]*'/",
$ligne,
$parties,
PREG_PATTERN_ORDER );

j'obtiens bien ce que je recherchais soit :
$parties[1][0] à $parties[1][4]


Array (
[0] => Array (
[0] => 'truc'
[1] => 'bidule'
[2] => 'machin_01'
[3] => 'chose'
[4] => ''
)
[1] => Array (
[0] => truc
[1] => bidule
[2] => machin_01
[3] => chose
[4] =>
)
)

et je t'en remercie encore.


mais au-dela de la magie du truc (!), j'aimerai comprendre :


[^']*
^^^^^
|
QUE ce qui commence et finit
par une apostrophe


( [^']* )
^ ^
|_________|
ET se trouve entre parenthèses
mais SANS les parenthèses


[ t]* ([^']*) [ t]*
^^^^^^ ^^^^^^
|_______________|
ET sans espace
ni avant ni après


' [ t]*([^']*)[ t]* '
^ ^
|_______________________|
ET sans apostrophe
ni avant ni après


"/ '[ t]*([^']*)[ t]*' /"
^^ ^^
|___________________________|
les délimiteurs




j'ai bon ?


--
@@@@@
E -00 comme on est very beaux dis !
' `) /
|_ =="


Avatar
Olivier Miakinen

alors :
en modifiant un poil (ajout des / et / comme délimiteurs [...]


Ah oui, j'avais oublié.

donc avec :
preg_match_all( "/'[ t]*([^']*)[ t]*'/",
$ligne,
$parties,
PREG_PATTERN_ORDER );

j'obtiens bien ce que je recherchais soit :
$parties[1][0] à $parties[1][4]

Array (
[0] => Array (
[0] => 'truc'
[1] => 'bidule'
[2] => 'machin_01'
[3] => 'chose'
[4] => ''
)
[1] => Array (
[0] => truc
[1] => bidule
[2] => machin_01
[3] => chose
[4] =>
)
)


Parfait.

mais au-dela de la magie du truc (!), j'aimerai comprendre :


[^']*
^^^^^
|
QUE ce qui commence et finit
par une apostrophe


Non. Un nombre quelconque (0 ou plus) de caractères qui NE sont PAS des
apostrophes.

( [^']* )
^ ^
|_________|
ET se trouve entre parenthèses
mais SANS les parenthèses


Euh... je dirais plutôt « à mettre dans $parties[1] »

[ t]* ([^']*) [ t]*
^^^^^^ ^^^^^^
|_______________|
ET sans espace
ni avant ni après


Plus exactement : il PEUT y avoir des espaces avant et après, mais elles
ne seront pas dans $parties[1], seulement dans $parties[0]. Au passage,
je ne crois pas que mon expression supprime vraiment les espaces après.
Si tu en as besoin, il faudra peut-être faire un rtrim() ou améliorer la
regexp.

' [ t]*([^']*)[ t]* '
^ ^
|_______________________|
ET sans apostrophe
ni avant ni après


Plus exactement : il FAUT qu'il y ait une apostrophe avant et après,
mais qui ne seront pas dans $parties[1], seulement dans $parties[0].

"/ '[ t]*([^']*)[ t]*' /"
^^ ^^
|___________________________|
les délimiteurs


Oui, pardon.

j'ai bon ?


Ben... c'est-à-dire... Lire peut-être <http://www.pcre.org/pcre.txt> ou
<http://fr2.php.net/manual/fr/reference.pcre.pattern.syntax.php> ;-)

--
Olivier Miakinen
Troll du plus sage chez les conviviaux : le nouveau venu, avec
son clan, s'infiltre dans les groupes de nouvelles. (3 c.)

Avatar
Florian Sinatra
*Olivier Miakinen* @ 20/06/2006 15:40 :
"/ '[ t]*([^']*)[ t]*' /"
^^ ^^
|___________________________|
les délimiteurs



Auxquels il faut faire attention : s'ils sont aussi présents dans le
motif, c'est la cata. <http://expreg.com/expreg_article.php?art=apcre_delim>

j'ai bon ?


Ben... c'est-à-dire... Lire peut-être <http://www.pcre.org/pcre.txt> ou
<http://fr2.php.net/manual/fr/reference.pcre.pattern.syntax.php> ;-)


Voir aussi : <www.expreg.com>


Avatar
newdb
Olivier Miakinen <om+ wrote:
j'ai bon ?



bon. manifestement, il faut que je prépare la session de septembre...

Ben... c'est-à-dire... Lire peut-être <http://www.pcre.org/pcre.txt> ou
<http://fr2.php.net/manual/fr/reference.pcre.pattern.syntax.php> ;-)


ah. ok.

je traduis (« La chaîne de caractères PHP simple ou double guillemet a
une signification spéciale des anti-slashs. ») ;

je corrige (« Par exemple, le masque char(don|mant|) acceptera les mots
"char", "charmant", ou "charmant". Sans les parenthèses, il
n'accepterait que "chardon", "mant" ou la chaîne vide "". ») ;

et je me donne quelques semaines pour assimiler ... ;-)



en tout cas, merci pour la référence
(j'en était à <http://www.anaesthetist.com/mnm/perl/regex.htm> et à
<http://www.comp.leeds.ac.uk/Perl/matching.html>...)

--
@@@@@
E -00 comme on est very beaux dis !
' `) /
|_ =="


Avatar
Thomas Harding
Le 20-06-2006, denisb a écrit :
je corrige (« Par exemple, le masque char(don|mant|) acceptera les mots
"char", "charmant", ou "charmant". Sans les parenthèses, il
n'accepterait que "chardon", "mant" ou la chaîne vide "". ») ;


les parenthèses (lorsqu'elles ne sont pas échappées par ), font deux
choses:
- elles délimitent les atomes (ce qui est décomposé de manière
atomique). Ca, c'est que tu viens de nous sortir :)
- elles donnent une référence, qu'on peut utiliser dans la deuxième
partie de l'expression, qui peut être le remplacement (cas de
preg_replace: 1 va te sortir 'don' ou 'mant' ou ''), ou, cas de
preg_match_all, la variable placée dans l'argument 'match' te
sortira $match[0] = "la même chose que le 1 du replace", et
l'indice max augmentera autant de fois que le motif sortira :
"char charmant chardon" => array( 0 => "", 1 => "mant", 2 =>
"don");

J'espère avoir été clair. Pour plus de détail, voir le bouquin
« Comprendre les expressions rationnelles » chez O'Reilly (un pavé
indigeste que je ferais bien de finir, voire de recommencer à lire).

et je me donne quelques semaines pour assimiler ... ;-)


'va falloir, mais personnellement, je n'ai _jamais_ fini de les
assimiler, et pourtant j'en accouche difficilement cinq ou six par
semaine (je ne compte pas les trucs bateaux en uniligne style
grep -ve "^[t ]*$" machin > truc). :)

--
Thomas Harding

Avatar
newdb
Thomas Harding wrote:
Le 20-06-2006, denisb a écrit :
je corrige (« Par exemple, le masque char(don|mant|) acceptera les mots
"char", "charmant", ou "charmant". Sans les parenthèses, il
n'accepterait que "chardon", "mant" ou la chaîne vide "". ») ;
les parenthèses (lorsqu'elles ne sont pas échappées par ), font deux

choses:


oui oui.
c'était une boutade (prétentieuse) de ma part :
corriger «...acceptera les mots "char", "charmant", ou "charmant"...»
par «...acceptera les mots "char", "chardon", ou "charmant"...»
________________________________________^^^


--
@@@@@
E -00 comme on est very beaux dis !
' `) /
|_ =="