2009-11-13 7 views
0

Voici le modèle que je veux correspondre:PHP, preg_match, Expression régulière. Qu'est-ce que je fais mal?

<div class="class"> 
<a href="http://www.example.com/something"> I want to be able to capture this text</a> 
<span class="ptBrand"> 

C'est ce que je fais:

$pattern='{<div class="productTitle">[\n]<((https?|ftp|gopher|telnet|file|notes|ms-help):((//)|(\\\\))+[\w\d:#@%/;$()~_?\+-=\\\.&]*)>([^\n]*)</a>[\n]<span class="ptBrand">}'; 

preg_match($pattern, $data, $matches,PREG_OFFSET_CAPTURE); 

print_r($matches); 

Il imprime:

Array()

Répondre

5

En général Règle, les expressions régulières sont un très mauvais moyen d'analyser HTML. Ils ne sont pas fiables et ont tendance à être vraiment compliqués. Une solution beaucoup plus robuste consiste à utiliser un analyseur HTML. Voir Parse HTML With PHP And DOM.

Quant à votre expression, je ne vois pas <div class="productTitle" nulle part dans la source, donc je commencerais là. De même que vous essayez d'analyser une URL, mais il n'y a aucune mention de la balise d'ancrage (soit directement, soit par un caractère générique suffisant) de sorte qu'il va y manquer aussi. Fondamentalement, cette expression ne ressemble pas du tout le code HTML que vous essayez d'analyser.

+0

Is not {} délimitant. – manny

0

Le motif:

/<div class="class">\s*<a href=\"([^"]+)\">([^<]+)</a>/m

obtiendrait à peu près le lien et le texte, mais en utilisant la bibliothèque DOM serait une méthode beaucoup mieux.

0

Vous pouvez essayer ceci:

<a href=".*?">([\s\S]*?)</a> 
1

... Ou ceci:

preg_match('/\s*([^>]+)\s*<\/a/',$string,$match); 

Trims aussi.

Questions connexes