Newsgroup: it.comp.www.php
Titolo: Un aiuto al volo con una regexp?

Ciao ragazzi, sono un pò arrugginito in tema regexp, anche se questa
non mi sembra particolarmente difficile, non ci salto fuori..
Allora, ho delle stringhe di testo che sono sempre formate da:
[COSTANTE][VAR_1][COSTANTE][VAR_2]
Cioè, ad esempio:
"Sostituire pippo con pluto"
"Sostituire pioggia con neve"
'sostituire' e 'con' sono le costanti, pippo, pluto, pioggia, neve le
variabili.
Io devo recuperare la variabili..
il problema è che queste variabili possono contenere veramente di
tutto, anche le stesse stringhe usate nelle costanti, ad esempio:
"Sostituire mexico con connecticut"
Io ho provato con (nell'esempio "sostiture...con"):
$b = preg_match("(Sostituire){1}^(con){1}^?", $stringa);
ma nada..


Le stringhe possono avere degli spazi in mezzo?
Se la risposta è no ti basta
\S+ (\S+) \S+ (\S+)


mmh, non funziona.. vabbè vista la semplicità ho risolto con 1 strrpos
e 2 substr...
Cmq nel mio caso le due stringhe variabili potrebbero contenere di
tutto, lettere, simboli, numeri e spazi

tutto, lettere, simboli, numeri e spazi
Si tratta di una cosiddetta "grammatica ambigua". Non c'e' garanzia di 
trovare la costante giusta.
Se ti trovi "Sostituire A con B con C" puoi interpretarlo cosi':
1) La prima parte e' "A con B", la seconda e' "C"
2) La prima parte e' "A", la seconda "B con C'
Decidi tu se e' possibile, cosa vuoi fare in questo caso ecc.

 Decidi tu se e' possibile, cosa vuoi fare in questo caso ecc.
nel mio caso sono sicuro al 100% che la stringa è composta da
'KEYWORD1 $testovariabile1 KEYWORD2 $testovariabile2'
Cioè, ad esempio, "Sostituire A con B"...
E' tecnicamente possibile (cioè, diciamo che non è impossibile)
trovarsi con
"Sostituire A con C con B", e in questo caso io dovrei ottenere che
$testovariabile1 = 'A con C' e $testovariabile2 = 'B'
In poche parole la mia regexp ideale dovrebbe fare:
`prendi tutto quello che trovi tra la prima keyword e l'ultima
occorrenza della seconda keyword, poi quello che c'è dopo la seconda
keyword`

 "Sostituire mexico con connecticut"
le 2 cose "fisse sono: "Sostituire: "
quindi la prima cosa prendo '/Sostituire: (.*)\ /ix'
termina al primo spazio



<?php
$a = "Sostituire A con B";
$b = preg_split('/Sostituire (.*)\ /ix', $a);
var_dump($b);
//output: array(2) { [0]=>  string(0) "" [1]=>  string(1) "B" }
?>
Comincio ad avvicinarmi ;)

 Comincio ad avvicinarmi ;)
Se la prima variabile non potesse essere " $lettere con $lettere"  
basterebbe
/Sostituire (.+?) con (.+)/
In questo caso Sostituire A con B con C
ti darebbe 'A' e 'B con C'
-- 
MailTo: anforagimailpuntocomï¿œ

 potrebbero contenere qualsiasi combinazione di lettere, numeri, spazi 
allora il tuo problema non ha soluzione
ad esempio sarebbe impossibile distinguere tra queste due coppie di 
variabili:
prima coppia:
var1=uno con uno
var2=uno
seconda coppia:
var1 = uno
var2 = uno con uno
in entrambi i casi la frase viene:
"sostituire uno con uno con uno"
è quindi impossibile dire in modo certo chi è var1  e chi è var2
Oppure hai  posto male il problema.

 Oppure hai  posto male il problema.
con le regexp non è possibile definire anche l'ultima occorrenza di un
gruppo (cioè del 'con'?)
vabbhè, come ho già detto in questo caso specifico l'ho già risolto
anche abbastanza elegantemente con 2 strrpos e 1 substr, ma in futuro
mi piacerebbe capire se una cosa come questa può essere risolta con le
regexp o meno

 gruppo (cioè del 'con'?)
Il punto è che non si capisce (in italiano) la semantica nel caso 
"sostituire uno con uno con uno", quale dei due "con" è di controllo e 
quale è invece parte del dato?
Se non sei in grado esprimere il problema non puoi neanche formalizzarlo.

 gruppo (cioè del 'con'?)
e che c'entra scusa?
non hai appena detto che variabile 2 puo' essere "qualsiasi combinazione 
di lettere, numeri, spazi" ?
come fai a sapere che l'ultima occorrenza di "con" non appartenga a 
variabile 2

 variabile 2
perchè è fissa, non è una variabile, ma l'aggiungo io fisicamente alla
stringa (in un passaggio precedente).
Cmq vabbhè ragazzi, ho risolto senza regexp, non stiamo ad
impazzirci ;)

 stringa (in un passaggio precedente).
Qua invece hai cambiato approccio inserendo i doppi apici come 
delimitatori, in questo caso è facile con le regexp perché sai che 
COSTANTE_2 si deve trovare tra due apici.

 keyword, poi quello che c'è dopo la seconda keyword`
COSTANTE_2 è sempre e solo l'ultima occorrenza... quindi niente ambiguità.

 ambiguità.
Tanto per completezza... sono molto arrugginito con le regexp, ma con 
l'aiuto dell'ancoraggio alla fine della stringa dovrebbe essere una cosa 
del genere (non provata e sicuramente ottimizzabile)
/COSTANTE_1 (.+) COSTANTE_2 (.+?)$/

 COSTANTE_2 è sempre e solo l'ultima occorrenza... quindi niente ambiguità.
Ok, giusto per chiarire:
COSTANTE_1="Sostituire"
COSTANTE_2="con"
testo_1="pippo"
testo_2="con"
La stringa unita è "Sostituire pippo con con" e in teoria si vorrebbe 
sostituire "pippo" con "con" ma da come vuoi interpretare tu il 
programma cercherà "pippo con" e lo sostituirà con niente, cioè lo 
cancellerà. È questo il comportamento che vuoi?

 Può volerci molto sforzo per superare questo tipo di impasse.


Wow :-)