Question

J'essaie de trouver un moyen de répertorier tout ce qui se trouve entre les balises < a > et < / a > . Donc, j'ai une liste de liens et je veux obtenir les noms des liens (pas où les liens vont, mais ce qu'ils s'appellent sur la page). Serait vraiment utile pour moi.

Actuellement, j'ai ceci:

$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;
  }
}
Était-ce utile?

La solution

La clause de non-responsabilité standard s'applique: l'analyse du code HTML avec des expressions régulières n'est pas idéale. Le succès dépend de la qualité de la saisie au niveau caractère par caractère. Si vous ne pouvez pas en garantir la validité, l’expression rationnelle échouera à un moment donné.

Cela dit:

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

Autres conseils

Je suis un grand fan de regex, mais ce n’est pas le bon endroit pour les utiliser.

Utilisez un véritable analyseur HTML.

  • Votre code sera plus clair
  • Cela sera plus susceptible de fonctionner

J'ai cherché Google dans un analyseur syntaxique HTML et j'ai trouvé celui-ci .

Si vous savez que vous travaillez avec XHTML, vous pouvez utiliser l'analyseur XML standard de PHP.

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

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

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

$ 2 = Allez sur stackoverflow.com

J'ai répondu à une question similaire pour tout effacer, à l'exception des balises ici

Regex, la magie noire, encore:)

J'ai trouvé une question sympa sur les expressions rationnelles courantes. Vous y trouverez des liens intéressants où vous trouverez des expressions rationnelles très communes comme la vôtre.

  

Capture de balises HTML

     

< TAG \ b [^ >] > (. ?) Analyser cette expression régulière avec RegexBuddy correspond aux paires d'ouverture et de fermeture d'une balise HTML spécifique. Tout ce qui se trouve entre les balises est capturé dans la première référence arrière. Le point d'interrogation dans l'expression régulière rend l'étoile paresseuse, pour s'assurer qu'elle s'arrête avant la première balise de fermeture plutôt qu'avant la dernière, comme le ferait une étoile gourmande. Cette expression rationnelle ne correspondra pas correctement aux balises imbriquées à l'intérieur d'elles-mêmes, comme dans un seul.

     

< ([AZ] [A-Z0-9] ) \ b [^ >]] / gt; > (. *?) Analyser cette expression régulière avec RegexBuddy correspondra à l'ouverture et à la fermeture paire de balises HTML. Assurez-vous de désactiver la sensibilité à la casse. La solution de cette solution est l’utilisation de la référence arrière \ 1 dans la regex. Tout ce qui se trouve entre les balises est capturé dans la deuxième référence arrière. Cette solution ne correspondra pas non plus aux balises imbriquées dans elles-mêmes.

Sinon: parcourez ce lien: mot clé " lien " . Il existe des approches intéressantes pour filtrer les liens.

J'espère que cela vous aidera:)

Bonne chance!

Bien .. L'utilisation d'expressions régulières n'est pas parfaite, mais dans l'expression rationnelle Perl,

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

devrait vous donner le nom du premier lien sur cette ligne du groupe de correspondance un, en ignorant la casse.

Limitations:

  • Ne gère pas plusieurs liens sur une même ligne
  • Ne gère pas les liens sur plusieurs lignes.
  • Correspond également aux balises d'ancrage.

Vous pouvez contourner ce problème en joignant toutes les lignes en une ligne, puis en le divisant en un tableau (ou en plusieurs lignes) en utilisant le lien début comme séparateur.

Le meilleur et le plus rapide moyen de créer une liste de ce qu'il y a entre, est d'utiliser preg_match_all.

Exemple:

$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]);

Le résultat sera:

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

Avec le motif

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

Vous aurez

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

Recherche dans ce balisage:

<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>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top