Domanda

C'è qualcuno con più conoscenza di me sulle espressioni regolari sanno come contempla il codice HTML in modo che tutti i tag e tutte le parole siano separati cioè.

<p>Some content <a href="www.test.com">A link</a></p>

è separato in questo modo:

array = { [0]=>"<p>",
          [1]=>"Some",
          [2]=>"content",
          [3]=>"<a href='www.test.com'>,
          [4]=>"A",
          [5]=>"Link",
          [6]=>"</a>",
          [7]=>"</p>"

Ho usato preg_split finora e dispongono di successo è riuscito a dividere la stringa da spazi bianchi o diviso da tag -. Ma poi tutto il contenuto è in un elemento dell'array quando ho eed questo da dividere a

Chiunque darmi una mano?

È stato utile?

Soluzione

preg_split non deve essere utilizzato in questo caso. Prova preg_match_all:

$text = '<p>Some content <a href="www.test.com">A link</a></p>';
preg_match_all('/<[^>]++>|[^<>\s]++/', $text, $tokens);
print_r($tokens);

uscita:

Array
(
    [0] => Array
        (
            [0] => <p>
            [1] => Some
            [2] => content
            [3] => <a href="www.test.com">
            [4] => A
            [5] => link
            [6] => </a>
            [7] => </p>
        )

)

presumo si è dimenticato di includere il 'A' in 'A link' nel tuo esempio.

rendersi conto che quando il codice HTML contiene Non e 'intesa come l'inizio o la fine del tag, le cose regex rovinare una brutta! (Da qui le avvertenze)

Altri suggerimenti

Si potrebbe verificare semplice HTML DOM Parser

O guardare il DOM parser in PHP

semplice HTML DOM Parser una prova. HTML è troppo irregolare per le espressioni regolari.

Non sono d'accordo con Bart circa la raccomandazione del preg_match_all() sopra preg_split().

Il compito è letteralmente a "dividere" l'intera stringa su una varietà di delimitatori. Io, prima, consiglio la stabilità di utilizzare un parser dom sopra regex, ma se non si richiede che il livello di stabilità perché il vostro html ingresso è relativamente prevedibile / semplicistico, quindi regex può essere usato come un più economico, un'alternativa più concisa.

Codice: ( Demo )

$html = <<<HTML
<p>Some content <a href="www.test.com">A link</a></p>
HTML;

var_export(preg_split('~\s+|(<[^>]+>)~', $html, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE));

Output:

array (
  0 => '<p>',
  1 => 'Some',
  2 => 'content',
  3 => '<a href="www.test.com">',
  4 => 'A',
  5 => 'link',
  6 => '</a>',
  7 => '</p>',
)

Il mio modello si divide in uno o più caratteri di spaziatura o su un (interpretazione debole a) tag html. Gli spazi bianchi sono semplicemente scartati. I tag vengono mantenuti nell'output.

Al di là di semantica logica, preg_split() ha l'ulteriore vantaggio di produrre un output meno gonfio e quindi più diretto. preg_split() fornisce un array monodimensionale e preg_match_all() fornisce un array multidimensionale.

Infine, preg_split() non può "fallire" come preg_match_all() potrebbe. Immaginate il caso frangia improbabile in cui la stringa di input non contiene spazi o tag. preg_split() restituisce la stringa di input intera come una singola serie di elementi (utile e coerente con stringhe di input più comuni). preg_match_all() genererà un array vuoto (non molto utile).

Attualmente uso semplice HTML DOM Parser in diverse applicazioni e trovare ad essere un ottimo strumento, anche quando confrontato con altri parser HTML scritte in altre lingue.

Perché cosa stai frazionamento HTML nella stringa di gettoni che hai descritto? non è una struttura ad albero di elementi DOM un approccio migliore per la vostra applicazione specifica?

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