Domanda

Sto cercando di trovare un modo per fare un elenco di tutto tra i tag < a > e < / a > . Quindi ho un elenco di collegamenti e voglio ottenere i nomi dei collegamenti (non dove vanno i collegamenti, ma come si chiamano nella pagina). Sarebbe davvero utile per me.

Attualmente ho questo:

$lines = preg_split("/\r?\n|\r/", $content);  // content is the given page
foreach ($lines as $val) {
  if (preg_match("/(<A(.*)>)(<\/A>)/", $val, $alink)) {     
    $newurl = $alink[1];

    // put in array of found links
    $links[$index] = $newurl;
    $index++;
    $is_href = true;
  }
}
È stato utile?

Soluzione

Si applica la dichiarazione di non responsabilità standard: l'analisi dell'HTML con espressioni regolari non è l'ideale. Il successo dipende dalla buona formazione dell'input a livello di carattere per carattere. Se non puoi garantirlo, la regex non riuscirà a fare la Cosa Giusta ad un certo punto.

Detto questo:

<a\b[^>]*>(.*?)</a>   // match group one will contain the link text

Altri suggerimenti

Sono un grande fan delle regex, ma questo non è il posto giusto per usarle.

Usa un vero parser HTML.

  • Il tuo codice sarà più chiaro
  • Sarà più probabile che funzioni

Ho cercato su Google un parser HTML PHP e ho trovato questo .

Se sai che stai lavorando con XHTML, puoi usare il parser XML standard di PHP.

<a\s*(.*)\>(.*)</a>

<a href="http://www.stackoverflow.com">Go to stackoverflow.com</a>

$ 1 = href = " www.stackoverflow.com "

$ 2 = Vai a stackoverflow.com

Ho risposto a una domanda simile per eliminare tutto tranne i tag qui

Regex, la magia nera, di nuovo :)

Ho trovato una bella domanda sulla regex comune. Ci sono alcuni link interessanti dove troverai regexpressions molto comuni come la tua.

  

Afferrare tag HTML

     

< TAG \ b [^ >] > (. ?) Analizza questa espressione regolare con RegexBuddy corrisponde alla coppia di apertura e chiusura di un tag HTML specifico. Qualsiasi cosa tra i tag viene acquisita nel primo backreference. Il punto interrogativo nel regex rende pigra la stella, per assicurarsi che si fermi prima del primo tag di chiusura piuttosto che prima dell'ultimo, come farebbe una stella golosa. Questa regex non corrisponderà correttamente ai tag nidificati al loro interno, come in onetwoone.

     

< ([AZ] [A-Z0-9] ) \ b [^ >] > (. *?) Analizza questa espressione regolare con RegexBuddy corrisponderà all'apertura e alla chiusura coppia di qualsiasi tag HTML. Assicurati di disattivare la distinzione tra maiuscole e minuscole. La chiave di questa soluzione è l'uso del backreference \ 1 nella regex. Qualsiasi cosa tra i tag viene acquisita nel secondo backreference. Questa soluzione non corrisponderà ai tag nidificati in se stessi.

Altrimenti: sfoglia questo link: parola chiave " link " . Esistono alcuni approcci interessanti per filtrare i collegamenti.

Spero che questo aiuti :)

Buona fortuna!

Bene .. L'uso delle espressioni regolari non è perfetto, ma in perl regexp,

m!<a .*?>(.*?)</a>!i

dovrebbe darti il ??nome del primo link su quella linea nel gruppo di match 1, ignorando il caso.

Limitazioni:

  • Non gestisce più collegamenti su una riga
  • Non gestisce i collegamenti che vanno su più righe.
  • Corrisponderà anche ai tag di ancoraggio.

Puoi aggirare questo problema unendo tutte le linee in una riga e quindi dividerle in un array (o più righe) usando il collegamento start come separatore.

Il modo migliore e più veloce per creare un elenco di ciò che è in mezzo è utilizzare preg_match_all.

Esempio:

$pattern = '#<a[^>]*>([^<]*)<\/a>#';
$subject = '<a href="#">Link 1</a> <a href="#">Link 3</a> <a href="#">Link 3</a>';
preg_match_all($pattern, $subject, $matches);
print_r($matches[1]);

Il risultato sarà:

Array (
 [0] => Link 1
 [1] => Link 3
 [2] => Link 3
)

Con lo schema

'<a.*?>(.*?)</a>'

Otterrai

['sign up', 'log in', 'careers 2.0']

Ricerca in questo markup:

<span id="hlinks-nav"><a href="/users/login?returnurl=%2fquestions%2f343115%2fregexp-for-finding-everything-between-a-and-a-tags">sign up</a><span class="lsep">|</span><a href="/users/login?returnurl=%2fquestions%2f343115%2fregexp-for-finding-everything-between-a-and-a-tags">log in</a><span class="lsep">|</span><a href="http://careers.stackoverflow.com">careers 2.0</a><span class="lsep">|</span></span>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top