Newsgroup: it.comp.www.php
Titolo: Problema lettura di una stringa su pagina web esterna

Ciao a tutti,
come da oggetto, mi trovo nella situazione di dover risolvere il seguente 
problema.
Intanto una premessa, abbiamo due pagine: PAGINA1.PHP e PAGINA2.PHP; in 
particolare PAGINA2.PHP:
a) contiene una stringa ben precisa che per comoditą chiamiamo STRINGA1;
b) č esterna rispetto a PAGINA1.PHP (in un altro server ad esempio).
Ciņ premesso, da PAGINA1.PHP devo leggere la stringa STRINGA1 contenuta in 
PAGINA2.PHP, o meglio ancora, devo attraverso PAGINA1.PHP accertarmi che 
STRINGA1 sia contenuta (presente) in PAGINA2.PHP.
Utilizzando il php, come posso compiere questa operazione?
Grazie in anticipo a chi puņ aiutarmi nel raggiungimento della soluzione a 
questo problema.
Cooper.
-- 
www.blueware.it
www.italchat.it
 

 Utilizzando il php, come posso compiere questa operazione?
per recuperare la stringa puoi partire da qua 
http://it.php.net/manual/en/function.file-get-contents.php
 se poi devi 
effettuare un qualche parsing del contenuto per ricercarla allora potresti 
approfondire qualcosa sulle Espressioni Regolari: 
http://it.php.net/manual/en/ref.pcre.php
ciao
Mario
_________________________
WEB: 
www.mario-online.com
________________________________ 


Ti ringrazio dei link, ho compreso il meccanismo, ma non ho degli esempi 
pratici su cui poter verificare meglio. Perň mi sembra di capire che sia una 
operazione semplice almeno in apparenza, combinando le due funzioni.
Se non ti chiedo molto, potresti darmi una dritta oppure portarmi un esempio 
pratico (o anche link se preferisci) dove viene esposta anche in maniera 
simile, il mio problema?
In sintesi, la pagina di origine PAGINA_A.PHP locata su un server, deve 
accedere a una seconda pagina esterna al server PAGINA_B.PHP e rilevare 
l'esistenza di una precisa stringa.
La stringa ha le caratteristiche seguenti:
a) inizia con <!-- BEGIN xxx.-->
b) terminacon <!-- END xxx -->
Il fine č copiare tutto il blocco compreso fra BEGIN e END (compresi i 
commenti) in una variabile stringa e verificare che essa corrisponde 
esattamente a quella che ho in PAGINA_A.PHP.
Tradotto in linguaggio php, come dovrei procedere?
Con file-get-content mi fa la copia di tutto il file in una variabile 
stringa, se questo primo passo č necessario ok non fa nulla, anche se a me 
interesserebbe solo la parte contrassegnata col BEGIN/END.
Quindi in sintesi ho capito come estrapolare l'intero file (ma vorrei sapere 
se posso evitare, estrapolando solo quello che mi interessa, e come in tal 
caso)?
Con le espressioni regolari dovrei quindi isolare dalla stringa complessiva 
solo la sottostringa che mi interessa, ma qui a essere sincero mi sono 
perso, di espressioni regolari non ho molta dimestichezza e so applicarle a 
casi semplici, ma questo mi sembra un pochettino piů complesso.
Quindi chiedo a voi, se potete anche in questo caso indicarmi come fare per 
raggiungere lo scopo, ovvero isolare il blocco di stringa che mi interessa e 
assegnarlo a una variabile.
Fiducioso in una risposta positiva, vi ringrazio anticipatamente.
Cooper.
-- 
www.blueware.it
www.italchat.it
 

 Tradotto in linguaggio php, come dovrei procedere?
Inserisci il contenuto di pagina_B in una stringa:
$str=file_get_contents("
http://pagina_B.htm
");
/* Ora crea un pattern (criterio) di riconoscimento della sottostringa
che vuoi intercettare ed estrarre da $str: */
$pattern="/<!-- BEGIN xxx\.-->(.*)<!-- END xxx -->/s";
/* Con l'aiuto del manuale prova a capire com'è costituito il pattern e
qual è il suo significato. Stessa cosa dicasi per preg_match() che hai
qui sotto */
preg_match($pattern,$str,$matches);
// Ora stampa l'array $matches: 
print_r($matches);
Nell'indice [0] -- se i miei calcoli sono giusti -- dovresti avere la
stringa che cerchi. 
P.S. Se il punto di cui parlavo all'inizio ti era sfuggito di mano,
ovviamente il pattern dovrà essere:
$pattern="/<!-- BEGIN xxx -->(.*)<!-- END xxx -->/s";
-- 
mailto: y = i
----------------------------------------
Vivo nel terrore di non essere frainteso 
(Oscar Wilde)


Grazie mille, ho compreso il significato del pattern in sostanza il (.*) 
equivale a "tutto ciò che è compreso fra", giusto?
Ho un altro piccolo problema, poichè il codice compreso fra il BEGIN e END 
può essere incollato dall'utente nella pagina web, accidentalmente 
aggiungendo qualche spazio etc, ho pensato bene di rimuovere gli spazi e gli 
eventuali codici di controllo, per fare questo ho aggiunto la riga:
$source = ltrim ($matches [0], "\x00..\x20");
e quindi per visualizzarla:
echo $source.
Nel codice html generato, ottengo sempre gli spazi il codice di origine, 
come se ltrim non ci fosse. Ho preso spunto dall'esempio riportato su 
php.net
 alla voce ltrim.
Cosa ho sbagliato?
Grazie ancora, per il tuo prezioso aiuto.
Cooper.
-- 
www.blueware.it
www.italchat.it
 

 $source = ltrim ($matches [0], "\x00..\x20");
Mmh... ltrim sta per l(eft)trim, cioè toglie spazi e caratteri d'altro
tipo unicamente ad inizio stringa (alla sua sinistra). Non fa per te. Se
vuoi davvero ripulirla dentro-fuori da caratteri indesiderati, hai
bisogno di un replace. Suggerisco preg_replace()
http://it.php.net/manual/en/function.preg-replace.php
il cui impiego, indovina un po? Richiederà un'altra regExp :-)



Grazie ancora per la risposta, dunque, ho provato a sostituira la riga:
 $source = ltrim ($matches [0], "\x00..\x20");
con:
preg_replace ("\x00..\x20", "", $matches [0])
però mi da errore, l'espressione regolare penso sia giusta, dal momento che 
specifico nel primo parametro tutti i caratteri ascii compresi fra 0 e 32, 
nel secondo specifico che devono essere sostituiti con una stringa vuota e 
nel terzo specifico la stringa su cui voglio operare, tuttavia mi viene 
restituito un errore :(
Dove sbaglio?
Cooper.
-- 
www.blueware.it
www.italchat.it

 specifico nel primo parametro tutti i caratteri ascii compresi fra 0 e 32,
Sě, ma li specifichi con un criterio ricavato dallo string charlist di
ltrim, che non va considerato "universale". Un pattern di RegExp segue
regole ben precise, esige i giusti delimitatori... insomma, se vuoi
capirci qualcosa bisogna che tu inizi a studiarci un po', altrimenti non
vai da nessuna parte.
Poi, sei sicuro di voler eliminare *tutti* gli ascii da 0 a 32? Capisco
i tab, il carriage return, il linefeed... ma lo space? vuoi una stringa
senza *neanche uno spazio*? 
Oh, tutti i gusti son gusti, in questo caso prova:
$source =preg_replace("/[\\x00-\\x20]/", "", $matches[0]);
Anche se, te lo dico francamente, in una classe (in quell'aggeggio fra
parentesi quadre) non ho mai inserito degli esadecimali, non so se ne
accetta un range, e non ho idea del risultato che puoi ottenere. Prova
-- anzi, citando una nota barzelletta -- vai avanti tu, che a me mi vien
da ridere :-)
Nell'assai probabile caso che il risultato sia indesiderato, abbandona
tutto, fai un copiaincolla:
$source =preg_replace("/(\n|\r|\t)/", "", $matches[0]); 
 echo $source;
e (forse) sei a posto.



Ok, però sembra abbia funzionato a dovere, certo quello che ho ottenuto non 
è più un codice html chiaramente, ma una sequenza pura di caratteri compresi 
fra 33 e 126.
Ti ringrazio moltissimo :)
Cooper.
-- 
www.blueware.it
www.italchat.it
 


Scusa se ritorno nuovamente sull'argomento, non capisco perchč l'istruzione: 
file_get_contents mi restituisce il seguente avviso bloccando l'esecuzione 
dello script, e ponendo il contenuto dell'array completamente vuoto:
Warning: file_get_contents(URL) [function.file-get-contents]: failed to open 
stream: Connection refused in PERCORSO-POSIZIONE-SCRIPT on line LINEA
a cosa č dovuto questo errore? come posso risolverlo? prima non me lo dava 
ora si :(
Grazie ancora,
Cooper.
-- 
www.blueware.it
www.italchat.it
 

 a cosa è dovuto questo errore? come posso risolverlo? prima non me lo dava 
Hai la direttiva "allow_url_fopen" impostata a ON?
--
rob4you

 ha scritto nel messaggio 
news:mn.39257d719...@KIEDIMELO.IT...

Si ho appena controllato sia in locale che in quello remoto, la direttiva è 
impostata a ON.
Quello che non capisco è perchè la function in cui è presente la funzione, 
se la richiamo da una pagina contenuta nella cartella principale del sito, 
funziona correttamente, mentre se la richiamo in una cartella interna al 
sito (non quella principale) allora ecco che mi da quell'errore.
A cosa è dovuto, e perchè? Non capisco quale legame ci possa essere fra la 
posizione in cui si trova la pagina con dentro la funzione e il responso 
della funzione stessa :(
Come posso risolvere? A parte dover mettere una pagina solo per la funzione 
nella cartella principale? (sarebbe poco pulito).


 (non quella principale) allora ecco che mi da quell'errore.
A questo punto ritengo sia un problema di come tu imposti il percorso 
(che tu hai indicato simbolicamente nell'esempio con la terna: 
"PERCORSO-POSIZIONE-SCRIPT").
Per cercare di capire meglio, provare a riportare qui cosa sono 
"PERCORSO-POSIZIONE-SCRIPT". Cioè in pratica riporta l'esatto warning 
che ti produce.
E inoltre controlla bene che lo script si trovi effettivamente nel 
percorso da te specificato.
--
rob4you
www.outofmind.eu


Ti riporto l'url diretto, in cui trovi l'errore:
 
http://www.italchat.it/prova1.php
se noti esso fa riferimento a un altro url:
 
http://www.italchat.it/prova.php
che esiste a tutti gli effetti come puoi ben vedere, per cui non comprendo 
la fonte dell'errore.
In locale mi funziona correttamente.


 In locale mi funziona correttamente.
Ma i due file in tal caso sembrano entrambi sullo stesso server.
Non so cosa ci sia scritto alla linea 49 del sorgente, ma prova, nel 
caso a sostituire:
file_get_contents(
http://www.italchat.it/prova.php
)
con: file_get_contents("
http://www.italchat.it/prova.php
")
Un'altra alternativa (non è il tuo caso, dal momento che hai gli 
url_open abilitati), è stata suggerita in questo ng meno di un mesetto 
fa (13 dicembre):
ob_start();
include('prova.php');
$html=ob_get_contents();
ob_end_clean();
In questo caso la variabile $html contiene tutto l'output di prova.php, 
che puoi successivamente parsare come preferisci.
--
rob4you
www.outofmind.eu


Sembrerebbe proprio di no, come dicevo prima ho provato a sostituire la riga 
di origine con le quattro righe, ma sensa ottenere alcun risultato.


 di origine con le quattro righe, ma sensa ottenere alcun risultato.
Ho fatto la stessissima prova, solo che il file prova.php era molto più 
semplice (c'era scritto solo "ciao"). E "magicamente" la variabile 
$html conteneva il contenuto di prova.php. :-)
Di conseguenza...il problema "non sembra" del comportamento della 
funzione, ma forse dipende più dal contenuto di prova.php. Se non erro 
nel tuo caso c'è un iframe al suo interno...e sinceramente non so come 
gestirlo.
--
rob4you


No nessun iframe, a me interessa il codice html (nella fattispecie 
javascript) ovvero quello che poi va a richiamare tutto il resto (ovvero 
l'iframe).
Cooper.
-- 
www.blueware.it
www.italchat.it
 

 l'iframe).
Sembra tutto normale...ma stranamente tu non riesci a fare ciò che 
vorresti.
Scusa, hai detto che in locale ti funziona e invece sul server remoto 
no, oppure non ti funziona da nessuna parte?
Non vorrei "rubare" i "segreti" ;-) di "prova.php", ma se vuoi posta 
qui il codice (o fallo via email, ti dò l'indirizzo se vuoi), così 
provo io a fare lo stesso che abbiam detto finora, perché come ti ho 
detto a me con una pagina "semplice" di prova funziona tutto 
normalmente.
Oppure prova tu a fare una pagina semplicissima "prova.php" e vedi se 
riesci a catturare l'output.
--
rob4you


Nessun segreto, anzi è qualcosa finalizzato a un servizio che intendo 
offrire al pubblico; se hai la possibilà,  possiamo verificare la cosa 
direttamente. Hai percaso msn? o skype?
Vorrei capire più di ogni altra cosa se è un problema interno al mio server 
o se è un bug della funzione  file_get_contents.
Con l'esperienza precedente, quel connection refused mi fa pensare che la 
funzione file_get_contents cerchi di collegarsi a una porta che il server ha 
blindato.
Nel caso specifico il mio server virtuale legge dalla 8080, mentre non 
vorrei che la funzione andasse ad accedere alla porta 80 che ovviamente non 
è accessibile dal server virtuale, rifiutando quindi la connessione in 
uscita.
Che ne pensi? E nel caso che la causa fosse questa, come posso andare a dire 
a php di ascoltare la 8080 anzichè la 80?
Ammesso che il problema sia questo (mi è venuto in mente, ragionando alla 
sherlock holmes :DDD), come dovrei risolvere?


 a php di ascoltare la 8080 anzichè la 80?
Non so se nella file_get_contents è possibile dirlo, ma potresti 
provare secondo la classica forma dell'RFC:
file_get_contents("
http://www.server.it:8080/prova.php
");
se non dovesse andare bene, potresti provare a usare la funzione di 
fsockopen, aprendo una connessione verso la porta 8080, una cosa tipo 
questa (la ho copiata in gran parte dal manuale alla voce fsockopen):
<?php
$fp = fsockopen("
www.italchat.it
", 80, $errno, $errstr, 30);
if (!$fp) {
    echo "$errstr ($errno)<br />\n";
} else {
    $out = "GET /prova.php HTTP/1.1\r\n";
    $out .= "Host: 
www.italchat.it
\r\n";
    $out .= "Connection: Close\r\n\r\n";
    fwrite($fp, $out);
    while (!feof($fp)) {
        $html.=fgets($fp, 128);
    }
    fclose($fp);
}
echo "<pre>".htmlentities($html)."</pre>";
?>
Ho appena provato lo script sul mio server locale, e funziona bene.
Se vuoi il codice javascript, ovviamente devi puntare all'opportuno 
file anziché a /prova.php: /kernel/js/webchat.js.
Tanto per precisare: ho provato anche a eseguire il seguente script:
<?php
$html=file_get_contents("
http://www.italchat.it/prova.php
");
echo "<pre>".htmlentities($html)."</pre>";
?>
E anche in questo caso funziona. :-)
Se invece volessi usare lo script:
<?php
ob_start();
include '
http://www.italchat.it/prova.php
';
$html=ob_get_contents();
ob_end_clean();
echo "<pre>$html</pre>";
?>
Bisognerebbe impostare a On la direttiva "allow_url_include".
In definitiva, sul mio server locale, funzionano tutti e tre i modi.
Eppure mi sono collegato esattamente al server italchat, alla pagina 
che tu stesso hai provato!
--
rob4you

> $fp = fsockopen("
www.italchat.it
", 80, $errno, $errstr, 30);
ops...la porta era la 8080.
(sempre se ho capito bene, ma io ho provato al tuo server con la 80 ed 
è andato good) ;-)
--
rob4you

 a php di ascoltare la 8080 anzichè la 80?
Scusa, ma nel mio post precedente non avevo capito. :-)
Restano comunque valide le prove che ho fatto, e che sono funzionanti, 
verso il server italchat (sulla porta 80, of course) :-)
Per quanto riguarda la tua domanda, non è un problema di PHP, ma caso 
mai di configurazione di webserver (apache?).
In genere quando si "monta" php (dipende anche da comelo usi php su 
apache), se ad esempio tu il server lo metti in ascolto sulla porta 
8080, per un determinato virtual host, se hai specificato la direttiva
AddType application/x-httpd-php .php
all'interno di quel virutal host, funzionerà solo con esso.
Se invece la direttiva la poni al di fuori, funzionerà sempre.
In pratica, non sei tu che devi dire a php di ascoltare su una porta, 
anzi, php non ascolta proprio! :-) Caso mai è il server che ascolta, e 
passa al processore php le richieste.
Forse però tu volevi dirmi altro, ma non ti ho capito. :-)
--
rob4you


La seconda soluzione sembra andare, ma rimane da risolvere il problema di 
sopra :( sul come separare le due parti dall'url, qualche consiglio?
Grazie ancora per la tua disponibilità e prezioso aiuto.
Cooper.
-- 
www.blueware.it
www.italchat.it
 

 Grazie ancora per la tua disponibilità e prezioso aiuto.
Figurati...siamo qui apposta! ;-)
--
rob4you
www.outofmind.eu