Newsgroup: it.comp.www.php
Titolo: Titolo HTML

Salve a tutti!
Ho già scritto in passato in questo newsgroup per chiedere aiuto, ed oggi 
mi trovo costretto a scrivere ancora. Mi sono accostato al php 
relativamente da poco e non ho ancora le conoscenze sufficienti per 
scrivere listati molto complessi
Vi espongo il mio problema: sto lavorando ad un minimotore di ricerca in 
php che funzioni senza indicizzazione. In pratica apre una dir, ne legge 
le sottocartelle, ne legge tutti i file, cerca nel file la parola/e 
richieste, memorizza il nome del file se l'ha trovato, passa al file 
successivo e così via, poi alla dir successiva ecc ecc fino a generare un 
output.
Posto che, dopo giorni di lavoro, inizio a credere che il php non sia il 
linguaggio migliore per creare un motore di ricerca (soprattutto se senza 
indicizzazione), ora che ci sono dentro ne vorrei uscire.
Finora però non ho descritto qual è il problema! ^____^
Allora: Il passo che mi manca per dare il tocco finale allo script è una 
funzione o qualcosa che mi permetta di estrarre il titolo del file .htm 
che è stato cercato per poi posizionarlo nell'output della pagina. Ora: 
non so proprio come estrarre e salvare in una variabile il testo 
contenuto tra i tag <title> e </title>. Mi basterebbe anche estrarre il 
titolo con i tag incorporati, li potrei togliere dopo in un secondo 
processo. Il problema che mi si pone è che non so come "selezionare" 
un'intera porzione di testo in un file...
Ho fatto numerosi tentativi, anche con strpos() e con explode(), ma tutti 
finiti con esito negativo.
Cercando su internet ho letto di una classe chiamata layout_html.inc che, 
tra le varie funzioni molto comode che include, ne ha anche una che (in 
una maniera a me sconosciuta, ovviamente), permette di salvare in una 
variabile il titolo di una pagina html, molto semplicemente:
get_html_title($nomefile);
cosa che per me sarebbe il massimo.
Sono stato per moltissimo tempo a cercare su 
php.net
, su 
phpfreak.com
 e 
su 
hotscript.com
 delle spiegazioni o dei rimandi a delle funzioni del php 
(come get_meta_tags()), ma non mi pare esista niente.
Spero di essere stato sufficientemente chiaro (oltre che logorroico 
^___^) nell'esplicitare il mio problema e spero che voi mi possiate o 
fornire un codice php per eseguire questa funzione oppure fornirmi un 
link a questo ricercatissimo layout_html.inc ...
Vi ringrazio anticipatamente per l'aiuto,
-- 
Luke, lo Steccalecca
    Email:   
alessandro...@tin.it
      ICQ:   120242146
Home Page:   
http://www.fanwars.cjb.net

 i tag <title> e </title>. Mi basterebbe anche estrarre il titolo con i
Prova con questa expr
preg_match("/<title>(.*)<\/title>/", $line_file, $titolo);
# la var $titolo[1] contiene il titolo
ciao

 # la var $titolo[1] contiene il titolo
Facendola case-insensitive ottieni più risultati o sbaglio? (ho "studiato"
preg_match() 20 secondi fa)
preg_match("/<title>(.*)<\/title>/i", $line_file, $titolo);
LAMASE

LAMASE <a@b.c> posted this:



e poi mettiamo anche U ed s, cosi diventa perfetto 
qualche modifica anche al tag, non si sa mai...
preg_match("/<title.*>(.*)<\/title.*>/isU", $line_file, $titolo);
-- 
I'm not a signature.

 indicizzazione), ora che ci sono dentro ne vorrei uscire.
Ma, il PHP (come il PERL) e' proprio adattato a questo tipo di lavoro perche'
ci sono dei potentissimi costrutti per elaborare il testo. Forse dipende solo
dal fatto che non hai ancora studiato quelli che servono.
Studia BENE i preg_ , quelli sono *il* segreto. Dopo la digestione elaborare 
testo con php ti sembra una sciocezza. In effetti basta spesso *UNA* riga per 
elaborare anche un problema complesso (tipo prendere tutti i link di una 
pagina html con tanto di descrizione ed attributi vari).
Ma ti tocca a studiarli secco, non sono facili e fanno la differenza tra 
conoscere il PHP e sapere il PHP... Un po' come dire di conoscere Word
senza aver mai programmata una riga di una Macro per capire la vera 
potenzialita' di questi tool.
Cmq. qua ti possiamo dare dei consigli se qualche espressione non fa quella
che ti immaginavi farlo.


 preg_match("/<title.*>(.*)<\/title.*>/isU", $line_file, $titolo);
Beh, grazie a tutti, la provo e poi vi faccio sapere se funziona!


 che ti immaginavi farlo.
Ok, grazie, non mancherò!


 preg_match("/<title.*>(.*)<\/title.*>/isU", $line_file, $titolo);
Ehm, come al solito i problemi non si risolvono mai al primo colpo...
^____^
Dunque, immagino che la variabile $line_file la debba impostare io, vero?
Quindi ci andrebbe il nome del file di cui voglio il titolo, immagino, 
vero?
Se no, cosa ci devo mettere, il numero di riga in cui compare il tag 
<title>?
Se è così, come faccio? Mi spiego: ovviamente il numero di linea dove 
viene posto <title> non è sempre lo stesso, ma trovarlo non sarebbe poi 
troppo complesso... Il problema si porrebbe quando compare un codice 
tipo:
<title>
Qui c'è il titolo
</title>
Cosa che non è molto frequente ma si trova...
Cosa devo fare, in pratica?
Grazie ancora dell'aiuto,


 Cosa devo fare, in pratica?
C'e' gia' dentro la regular expression (con questo /s alla fine, vorebbe
dire: ignora righe. /U=match meno possibile /i=ignore case).
Esempio pratico (e completo!) per leggere da un qualsiasi file html il
titolo:
<?php
$file=join("",file("pagina.html"));
if (preg_match("/<title.*>(.*)<\/title.*>/isU", $file, $match))
    echo trim($match[1]);
?>
Esempio per leggere *tutte* le tabelle in un html:
<?php
$file=join("",file("pagina.html"));
if (preg_match_all("/<table.*>(.*)<\/table.*>/isU", $file, $matchAll))
{
    for ($i=0; $i < count($matchAll[1]); $i++)
        echo trim($match[1][$i])."\n";
   }
?>
Esempio per leggere tutti i link (semplificato pero', href deve avere "")
<?php
$file=join("",file("pagina.html"));
if (preg_match_all("/<a.*href=\"(.*)\".*>(.*)<\/a.*>/isU", $file,
$matchAll))
{
    for ($i=0; $i < count($matchAll[1]); $i++) {
       echo trim($matchAll[1][$i])." - \n";
       echo trim($matchAll[2][$i])."<BR>\n";
   }
}
?>
cmq. direi di cominciare a leggere un po' dei manualetti in giro.
http://it.php.net/pcre
 per inziare.

 
http://it.php.net/pcre
 per inziare.
Ok, grazie mille!


 Ah... Devo iniziare a studiarmeli tutti 'sti parametri!
 
Dai un'occhiata (se hai voglia :) all'indirizzo
http://www.effectiveperl.com/toc.html
, capitolo Regular Expressions
(
http://www.effectiveperl.com/EP.04.pdf
). Non è male... è in eng.
ciao

     echo trim($match[1]);
Dunque, posto che lo script funziona a meraviglia (ancora grazie! 
^____^), torno ad assillare tutti voi con i miei irrisolvibili 
problemi...
Dunque, come già detto, questo ambaradan mi serviva per ricavare i titoli 
da far visualizzare in un motore di ricerca...
Ovviamente le pagine trovate saranno più d'una...
E me le gioco infilando i nomi dei file trovai in un array...
Quindi ora sorge il problema: per processare tutti i dati c'è un foreach, 
dentro cui metto tutte le varie funzioni ecc. ecc...
In questo foreach c'è anche il miniscript che mi avevi fornito, solo 
che... Funziona solo per il primo file! Per tutti i file successivi 
continua a quotarmi sempre il titolo della prima pagina... :(((
Non so che pesci pigliare, ho fatto un po' di prove ma niente... :(
Cito, per comodità, lo script ridotto all'osso (non ho tolto quasi 
niente). $found è l'array dove sono contenuti i nomi di tutti i file 
trovati (./nomefile.ext):
<!-- Inizio Script
foreach ($found as $value)
{
	$filet=join("",file("$value"));
	if (preg_match("/<title.*>(.*)<\/title.*>/isU", $filet, $match))
    	$titolo = trim($match[1]);
	echo "<a href=\"$value\">".$titolo."</a><br>";
}
-->
Heeelp! Un enorme grazie a chi riuscirà ad aiutarmi!


 (
http://www.effectiveperl.com/EP.04.pdf
). Non è male... è in eng.
Graz! ^_____^


 }
Non hai resettato la variabile $titolo se non trova un titolo ti visualizza
la variabile del giro prima.
if (preg_match("/<title.*>(.*)<\/title.*>/isU", $filet, $match))
  $titolo = trim($match[1]);
else
  $titolo = "nessun titolo trovato in '$value'";

 la variabile del giro prima.
Grazie, ha funzionato!
Ora avrei un'altra domanda: ho iniziato a studiare le espressioni 
regolari, ho trovato in giro su internet dei begli esempi...
Mi si presenta un problema, sempre per questo motore di ricerca:
č possibile inserire in una espressione regolare una variabile?
Ci ho provato inserendola \$var con la slash davanti per evitare che mi 
prendesse il $ come simbolo di fine riga, perň non funziona...
Io dovrei prendere dieci parole (\w{10}, si indica cosě, vero?) prima e 
dopo il testo contenuto nella variabile. Ho quindi tirato fuori:
preg_match("/(\w{10})\$var(\w{10})/", $file, $match)
perň non funziona. Dove sbaglio?
Grazie ancora dell'aiuto (e della pazienza! ^____^)


 perň non funziona. Dove sbaglio?
Il livello della interepretazione:
 "/(\w{10})\$var(\w{10})/"
passera' alla preg_match
  /(\w{10})$var(\w{10})/
e quindi lo interpreta come fine stringa
lo dovresti passare cosi:
 "/(\\w{10})\\\$var(\\w{10})/"
ti conviene di assegnare la regexp ad una variabile
$regexp="/(\w{10})\$var(\w{10})/";
e poi con echo $regexp; vedi esattamente che cosa passi alla funzione.
ma: tu cerchi il contenuto della $var o $var stesso? Se non mi sbaglio il
contenuto, e' allora dovrebbe andare bene questo:
$regexp='/(\w{10})'.preg_quote($var).'(\w{10})/';
// leggi nel manuale perche' ho inserito preg_quote
Occhio in una stringa sono anche importante le cose sui quali non concentri
la ricerca. E cosi hai un errore con (\w{10}): tra due parole c'e' sempre
qualcosa che non sia una parola (\W).
Il resto a te... ;-)