PHP, preg_match, Expression régulière. Qu'est-ce que je fais mal?
-
19-09-2019 - |
Question
est le modèle ici que je veux correspondre:
<div class="class">
<a href="http://www.example.com/something"> I want to be able to capture this text</a>
<span class="ptBrand">
Voici 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 ()
La solution
En règle générale, les expressions régulières sont un moyen très pauvres de l'analyse syntaxique HTML. Ils sont peu fiables et ont tendance à finir par être vraiment compliqué. Une solution beaucoup plus robuste consiste à utiliser un analyseur HTML. Voir Parse HTML avec PHP et DOM .
En ce qui concerne 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.
Autres conseils
... Ou ceci:
preg_match('/\s*([^>]+)\s*<\/a/',$string,$match);
Raccorde aussi.
Le schéma:
/<div class="class">\s*<a href=\"([^"]+)\">([^<]+)</a>/m
Cette commande va télécharger à peu près le lien et le texte, mais en utilisant la bibliothèque DOM serait une méthode beaucoup mieux.
Vous pouvez essayer ceci:
<a href=".*?">([\s\S]*?)</a>