2010-07-29 5 views
1

J'utilise php et j'ai un problème pour analyser le href de l'étiquette d'ancrage avec du texte.tag d'ancrage d'expression régulière

exemple: balise d'ancrage ayant test http://www.test.com

comme celui-ci <a href="http://www.test.com" title="test">http://www.test.com</a>

je veux correspondre tout le texte dans la balise d'ancrage

merci à l'avance.

+0

Pouvez-vous montrer ce que vous avez essayé? – antyrat

+1

http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454: ne pas analyser HTML avec regex. – katrielalex

+1

deux questions, 1er: voulez-vous faire correspondre test ou h ttp: //www.test.com? 2ème: voulez-vous faire correspondre ' or here?'? – Ties

Répondre

-1

En supposant que vous souhaitez sélectionner le texte du lien d'un lien d'ancrage avec ce href, alors quelque chose comme ça devrait fonctionner ...

$input = '<a href="http://www.test.com" title="test">http://www.test.com</a>'; 
$pattern = '#<a href="http://www\.test\.com"[^>]*>(.*?)</a>#'; 

if (preg_match($pattern, $input, $out)) { 
    echo $out[1]; 
} 

Ceci est techniquement parfait (en théorie> peut probablement être utilisé dans l'un des tags), mais fonctionnera dans 99% des cas. Comme plusieurs des commentaires l'ont mentionné, vous devriez utiliser un DOM.

-1

Si vous avez déjà obtenu la balise d'ancrage vous pouvez extraire l'attribut href par une regex assez facilement:

 
<a [^>]*href="([^"])"[^>]*> 

Si vous voulez au lieu d'extraire le contenu de la balise et vous savez ce que vous faites, il n'est pas trop difficile d'écrire un analyseur de descente récursif simple, en utilisant des expressions rationnelles en cascade, qui analyseront tous les cas sauf les plus pathologiques. Malheureusement PHP n'est pas un bon langage pour apprendre à faire cela, donc je ne recommanderais pas d'utiliser ce projet pour apprendre comment.

Donc, si c'est le contenu que vous recherchez, pas l'attribut, alors @katrielalex a raison: ne pas analyser HTML avec regex. Vous rencontrerez un monde de mal avec des balises de mise en forme imbriquées et d'autres HTML juridiques qui ne sont pas compatibles avec les expressions régulières.

6

Utilisation DOM:

$text = '<a href="http://www.test.com" title="test">http://www.test.com</a> something else hello world'; 
$dom = new DOMDocument(); 
$dom->loadHTML($text); 

foreach ($dom->getElementsByTagName('a') as $a) { 
    echo $a->textContent; 
} 

DOM est spécifiquement conçu pour analyser XML et HTML. Ce sera plus robuste que n'importe quelle solution regex que vous pouvez trouver.

+0

Non qu'il y ait quelque chose de "faux" dans la façon dont vous l'avez fait, pourquoi n'avez-vous pas simplement utilisé 'DomElement :: getElementsByTagName()' à la place de la requête XPath? Il devrait être plus efficace pour ce simple chemin ... – ircmaxell

+0

@ircmaxell: Je ne sais pas. Je l'ai mis à jour pour le faire à la place. –