PDA

View Full Version : [PHP] Espressioni regolari per eliminare file da una stringa contenente un URL


biowep
20-11-2010, 12:01
Ciao
ho una variabile contenente una stringa URL
$url = "http://www9.esempio.org/percorso/percorso/percorso/file.php?parametro=valore";
vorrei eliminare tutto quello che di trova dopo l'ultimo "/" e concatenare a $url il valore contenuto
<form id="forma" method="POST" name="logForm" action="login.php?lang=it">
in action="qui"
da notare che la sequenza degli attributi dentro <form> potrebbe cambiare
qualcuno sa come verrebbe scritta questa istruzione?

bobbytre
20-11-2010, 12:15
Ciao
ho una variabile contenente una stringa URL
$url = "http://www9.esempio.org/percorso/percorso/percorso/file.php?parametro=valore";
vorrei eliminare tutto quello che di trova dopo l'ultimo "/" e concatenare a $url il valore contenuto
<form id="forma" method="POST" name="logForm" action="login.php?lang=it">
in action="qui"
da notare che la sequenza degli attributi dentro <form> potrebbe cambiare
qualcuno sa come verrebbe scritta questa istruzione?

ma vuoi usare per forza le espressioni regolari o ti basta una soluzione che funzioni ?

biowep
20-11-2010, 12:21
non per forza
l'ideale sarebbe consigliarmi qualche libreria con la quale posso cercare elementi dalla pagina html [che viene salvata dentro una variabile] di risposta
ad esempio
faccio una richiesta con le funzioni cURL
la pagina viene salvata dentro una variabile che la contiene interamente
non esiste qualche libreria con cui cercare il valore degli attributi dentro i tag, verificare l'esistenza di certi tag in base all'id css...

comunque per quel lavoro li mi basta qualsiasi soluzione che funzioni sempre
l'importante che sia molto efficiente
considerando che questo script lavora con variabili contenenti stringhe lunghe come una pagina html

Fonta_88
20-11-2010, 13:21
Se sai usare javascript penso che si possa fare così:
Nel file .js crei una variabile globale alla quale, con una chiamata ad una funzione, assegni il valore della variabile $url privato della parte di testo che non ti interessa; quindi nel punto in cui ti serve l'indirizzo completo (con la parte che vuoi aggiungergli) chiami una seconda funzione, cui passi il pezzo finale, che concatena le stringhe e restituisce il valore corretto.

bobbytre
20-11-2010, 13:55
mi è poco chiaro quello che vuoi fare :confused:

biowep
20-11-2010, 14:17
Se sai usare javascript penso che si possa fare così:
Nel file .js crei una variabile globale alla quale, con una chiamata ad una funzione....
purtroppo non so niente di javscript

mi è poco chiaro quello che vuoi fare :confused:
dunque, ho questo script
$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL, "http://google.it");
curl_setopt ($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Chrome/7.0.517.44 Safari/534.7");
curl_setopt ($ch, CURLOPT_TIMEOUT, 30);
curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt ($ch, CURLOPT_AUTOREFERER, true);
curl_setopt ($ch, CURLOPT_HEADER, true);
curl_setopt ($ch, CURLOPT_COOKIEJAR, $cookie);
curl_setopt ($ch, CURLOPT_POST, true);
$result = curl_exec ($ch);

la variabile $result contiene tutto il codice HTML inviato dal server
in questo codice c'è questo form [non sto parlando di google]
<form id="forma" method="POST" name="logForm" action="login.php?lang=it">
io vorrei prendere il valore action="qui dentro"
e salvarlo dentro una variabile
da tener presente che gli attributi potrebbero essere scritti in modi sporso:
<form id="forma" action="login.php?lang=it" name="logForm" method="POST">

l'altra cosa da fare è
avendo una variabile
$url = "http://www9.esempio.org/percorso/percorso/percorso/file.php?parametro=valore";
voglio reimpostare questa variabile dopo aver eliminato tutto quello che si trova oltre l'ultimo "/"
questo mi serve per fare una richiesta ad una nuova pagina che sara
http://www9.esempio.org/percorso/percorso/percorso/quellochehopresodentroaction


potrei anche farlo utilizzando le variabili per gestire le stringhe [substr(); strpos(); strstr();]
pero diventa una cosa molto lunga e non credo sia molto efficiente dal momento che la variabile su cui lavorano è $result ed è molto lunga [una pagina HTML]

bobbytre
20-11-2010, 18:38
adesso ho capito cosa devi fare, quindi ti conviene usare le espressioni regolari.

magari prima ti estrai tutti i <form> dalla pagina che ricevi con preg_match_all e poi per ogni <form cerchi gli attributi che ti interessano.

biowep
21-11-2010, 11:39
sarebbe possibile creare un oggetto dom dalla pagina ricevuta e poi qui dentro cercare

$form = getElementById('forma');
$url = echo $form->getAttribute('action');

quello che non so fare è creare l'oggetto dom.
la pagina ricevuta dal server è salvata dentro la variabile $result che contiene una stringa lunghissima con il codice html

MEMon
21-11-2010, 12:35
sarebbe possibile creare un oggetto dom dalla pagina ricevuta e poi qui dentro cercare

$form = getElementById('forma');
$url = echo $form->getAttribute('action');

quello che non so fare è creare l'oggetto dom.
la pagina ricevuta dal server è salvata dentro la variabile $result che contiene una stringa lunghissima con il codice html

Dai un occhio a questo http://simplehtmldom.sourceforge.net/manual.htm#section_create e questo http://php.net/manual/en/class.domdocument.php

biowep
21-11-2010, 13:47
quella libreria l'ho gia provata
ma quando uso la funzione str_get_html
per creare l'oggettp dom, non finisce piu
una volta l'ho lasciato concludere lo script
ci ha messo piu di 5 minuti
è decisamente troppo

per quanto riguarda la documentazione,
ho provato questo esempio
http://www.php.net/manual/en/class.domdocument.php#95894
e nono viene fuori niente, pagina bianca [probabilmente un errore considerando che non vengono motrati]
e inoltre non capisco come faccia a caricare il codice html da $url se prima non ha fatto una richiesta curl per la pagina
$xml->loadHTMLFile($url);

biowep
22-11-2010, 17:14
sono riuscito ad estrarre il contenuto del attributo action in questo modo [magari può essere utile]
$ch = curl_init();
...
$result = curl_exec ($ch);
$dom = new domDocument;
$dom->loadHTML($result);
$form = $dom->getElementById('forma');
$url = $form->getAttribute('action');

qualcuno può aiutarmi ad eliminare l'ultima parte di una stringa [quella dopo l'ultimo "/"]?

stavo pensando di far esplodere la stringa ogni "/"
eliminare l'ultimo elemento dell'array generato dell'explode
per ogni valore dell'array, aggiungere "/" alla fine [perche con l'explode è stato cancellato]
e far implodere l'array, generando la stringa desiderata

dite sia un buon modo?

MEMon
22-11-2010, 17:41
sono riuscito ad estrarre il contenuto del attributo action in questo modo [magari può essere utile]
$ch = curl_init();
...
$result = curl_exec ($ch);
$dom = new domDocument;
$dom->loadHTML($result);
$form = $dom->getElementById('forma');
$url = $form->getAttribute('action');

qualcuno può aiutarmi ad eliminare l'ultima parte di una stringa [quella dopo l'ultimo "/"]?

stavo pensando di far esplodere la stringa ogni "/"
eliminare l'ultimo elemento dell'array generato dell'explode
per ogni valore dell'array, aggiungere "/" alla fine [perche con l'explode è stato cancellato]
e far implodere l'array, generando la stringa desiderata

dite sia un buon modo?

Andrebbe bene, se usi implode puoi specificare un separatore, quini non hai bisogni di riaggiungere "/".

MEMon
22-11-2010, 17:44
Oppure se ti piacciono le regex puoi usare questa per eliminare solo la coda

[^/]*$

biowep
22-11-2010, 18:14
e quale dei due è il più veloce per il server?