Domanda

Sto scrivendo uno script PHP che coinvolge raschiare pagine web.Attualmente, lo script analizza la pagina, riga per riga, ma rompe se c'è un tag che si estende su più righe, come

<img src="example.jpg"
alt="example">

Se n'è peggiore, mi potrebbe elabora la pagina da rimuovere tutte le interruzioni di riga, quindi il re-inserimento al più vicino >, ma questo mi sembra un kludge.

Idealmente, mi piacerebbe essere in grado di rilevare un tag che campate di versi, congiungere solo quelli a righe, e continuare l'elaborazione.
Così che cosa è il metodo migliore per rilevare questo?

È stato utile?

Soluzione 4

Forse per i progetti futuri userò un'analisi biblioteca, ma che tipo di a parte la questione a portata di mano.Questa è la mia soluzione attuale. rstrpos è strpos, ma dalla direzione opposta.Esempio di utilizzo:

for($i=0; $i<count($lines); $i++)
{
    $line = handle_mulitline_tags(&$i, $line, $lines);
}

Ed ecco che l'attuazione:

function rstrpos($string, $charToFind, $relativePos)
{
    $searchPos = $relativePos;
    $searchChar = '';

    while (($searchChar != $charToFind)&&($searchPos>-1))
    {
        $newPos = $searchPos-1;
        $searchChar = substr($string,$newPos,strlen($charToFind));
        $searchPos = $newPos;
    }

    if (!empty($searchChar))
    {
        return $searchPos;
        return TRUE;
    }
    else
    {
        return FALSE;
    }
}

function handle_multiline_tags(&$i, $line, $lines)
{
    //if a tag is opened but not closed before a line break,

    $open = rstrpos($line, '<', strlen($line));
    $close = rstrpos($line, '>', strlen($line));
    if(($open > $close)&&($open > -1)&&($close > -1))
    {
        $i++;
        return trim($line).trim(handle_multiline_tags(&$i, $lines[$i], $lines));
    }
    else
    {
        return trim($line);
    }
}

Questo probabilmente potrebbe essere ottimizzato in qualche modo, ma per i miei scopi è sufficiente.

Altri suggerimenti

Questo è uno dei miei pix pet: mai analizzare l'HTML a mano. Mai analizzare HTML con regexp. Mai analizzare HTML con i confronti tra stringhe. Sempre utilizzare un parser HTML per analizzare HTML – che è quello che stanno lì per.

È stato un lungo tempo da quando ho fatto qualsiasi PHP, ma una rapida ricerca mi ha fatto questo PHP5 parser HTML.

Non scrivere un parser, l'uso di qualcun altro: DOMDocument::loadHTML - questo è solo uno, penso che ci sono un sacco di altri.

Beh, questo non risponde alla domanda ed è più di un parere, ma...

Penso che la migliore raschiare strategia (e di conseguenza, per eliminare questo problema) non è quello di analizzare HTML riga per riga, che è innaturale per l'HTML, ma analizzare la sua naturale delimitatore:<> coppie.

Ci saranno due tipi di corsi:

  • Tag elementi che sono immediatamente chiuso, ad es., < br />
  • Tag elementi che necessita di un altro tag di chiusura, ad esempio, < p > testo < /p >

Si può vedere immediatamente il vantaggio dell'utilizzo di questa strategia, nel caso del paragrafo(p) tag:Sarà più facile analizzare mutiline paragrafi, invece di dover tenere traccia di dove il tag di chiusura.

Perché non leggi in una linea, e di impostare una stringa, quindi controllare che la stringa per il tag aperture e chiusure, Se un tag si estende su più di una riga aggiungere la riga successiva alla stringa e spostare la parte prima della parentesi graffa di apertura per il vostro trattati stringa.Poi basta analizzare attraverso l'intero file per fare questo.La sua non è bella, ma dovrebbe funzionare.

Se devi attaccare al vostro attuale metodo di analisi, ed è una espressione regolare, è possibile utilizzare il multi-flag della riga di "m" che si estendono su più righe.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top