php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2008

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 26.04.2008, 18:12  
Erfahrener Benutzer
 
Registriert seit: 21.07.2005
Beiträge: 209
pepe24
Standard Regex: Auslesen der Meta-Tags einer Webseite Sucheingrenzung

Grüß Euch!

Habe ein kleines Problem mit einem Regex. Ich möchte damit aus HTML-Quelltext die meta-tags auslesen und dabei ebenfalls ein bisschen auf die Performance achten.

Den get_meta_tags-PHP-Befehl kann ich leider nicht verwenden, da er leider nur Dateien verarbeiten kann bzw. auf Zielseiten mit fopen/ fsockopen zugreift und zuerst die Seite auslesen will, bevor er die Meta's extrahiert. Der HTML_Quelltext kommt bei mir aus einer Datenbank und liegt als String vor, den "get_meta_tags" leider nicht interpretiert. In den Kommentaren des genannten Befehls habe ich folgenden REGEX übernommen:

"|<meta[^>]+name=\"([^\"]*)\"[^>]+content=\"([^\"]*)\"[^>]+>|i".

Funktioniert bisher auch zufriedenstellend. Allerdings würde mich nun noch
interessieren, wie ich die Suche des Regex schon im vorhinein auf den bereich zwischen "<head>" und "</head>" eingrenzen kann. Da die <head> Bezeichnung noch mehrere eigenschaften halten kann und davor ja sowieso nicht allzuviel Quelltext steht, reicht wohl eine Eingrenzung im Sinne von "wenn </head> gefunden, dann sofort stoppen". Hat jemand evtl eine schnelle Idee, wie man das in vorhandenes Pattern einbinden kann?

grüße.
Peter
pepe24 ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 26.04.2008, 18:38  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Hallo,
ich wuerde hierfuer eher die XML Funktionen von PHP verwenden. Ueber Performance kann man ja reden wenn es so weit ist, aber da werden RegExp auch nicht so gut dastehen.

Den <head> wuerde ich so extrahieren.
[php]<?php
$strHtmlHead = substr($strHtml, 0, strpos($strHtml, "</head>"));
?>[php]
Zergling-new ist offline  
Alt 26.04.2008, 18:42  
Erfahrener Benutzer
 
Registriert seit: 21.07.2005
Beiträge: 209
pepe24
Standard

Klar, logisch. Manchmal sieht man den Wald vor lauter Bäumen nichtmehr.

Danke Zergling!
pepe24 ist offline  
Alt 26.04.2008, 19:35  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.989
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Am besten so, dann hast Du gleich einen vollständigen xml Baum:

PHP-Code:
<?
$strHtmlHead 
substr (substr ($strHtml
                               

                               
strpos ($strHtml"</head>") + 7) ,
                       
strpos ($strHtml"<head>"));
nikosch ist offline  
Alt 26.04.2008, 20:24  
Erfahrener Benutzer
 
Registriert seit: 21.07.2005
Beiträge: 209
pepe24
Standard

Hallo Nikosch, danke für das Additum.

So sieht nun die endgültige Lösung aus:

PHP-Code:
//META-Tags auslesen und verpacken
$strHtmlHead substr (substr $responseHTTP->getBody(),
                               
,  
                               
strpos $responseHTTP->getBody(), "</head>") + 7) , 
                       
strpos $responseHTTP->getBody(), "<head>"));
                       
                    
preg_match_all("|<meta[^>]+name=\"([^\"]*)\"[^>]+content=\"([^\"]*)\"[^>]+>|i",  $strHtmlHead$aMetaExtractionPREG_SET_ORDER);
                    
$aMetaArray = array();
                    
                    foreach(
$aMetaExtraction as $MetaUnique) {
                        
$aMetaArray[$MetaUnique[1]] =  $MetaUnique[2];
                    }
                    
                    
//META-Tags auslesen und verpacken ENDE 
pepe24 ist offline  
Alt 29.05.2008, 19:53  
Erfahrener Benutzer
 
Registriert seit: 21.07.2005
Beiträge: 209
pepe24
Standard

Grüß Euch!

bezüglich des Regex hätte ich nun doch noch eine ergänzende Frage.
Nach wie vor benutze ich diesen hier:
"|<meta[^>]+name=\"([^\"]*)\"[^>]+content=\"([^\"]*)\"[^>]+>|i".

Allerdings erweist er sich als nicht allgemeingültig genug in folgenden Situationen:

-"name" und "content sind vertauscht, also (<meta content=... name=... />)
-anstatt " wird ' verwendet

zu Punkt zwei habe ich folgenden Versuch gemacht und habe begrenzende \" durch [\"|\'] ersetzt. Das hat allerdings einen Fehler geworfen. Kann ich leider gerade nicht nachproduzieren, weil ich nicht an der Entwicklungsumgebung sitze.

Hat jemand einen Tip bereit?

Grüße!
pepe24 ist offline  
Alt 29.05.2008, 20:09  
CIX88
Gast
 
Beiträge: n/a
Standard

Zitat:
Hat jemand einen Tip bereit?
Anstelle von dein Delimiter | ein anderes Zeichen benutzen, und im Pattern eine Art ORDER ( mit | ) bauen. Oder eine Alternative mit (name|content) machen ...
 
Alt 29.05.2008, 21:24  
Erfahrener Benutzer
 
Registriert seit: 21.07.2005
Beiträge: 209
pepe24
Standard

Danke Cix.

Nun im Einsatz (und bisher lauffähig):

preg_match_all("~<meta[^>]+[content|name]=[\"|\']([^\"]*)[\"|\'][^>]+[content|name]=[\"|\']([^\"]*)[\"|\'][^>]+>~i", $strHtmlHead, $aMetaExtraction, PREG_SET_ORDER);


Grüße
pepe24 ist offline  
Alt 30.05.2008, 08:47  
Erfahrener Benutzer
 
Registriert seit: 21.07.2005
Beiträge: 209
pepe24
Standard

Nun... es wäre doch zu einfach gewesen...

Wie man oben sieht, schreibe ich die "Bezeichner -> Inhalt" Matches in ein Array.
Sollte ein Benutzer nun beim Meta Tag "content" und "name" vertauschen,
habe ich auf einmal den "Inhalt" als array-key und den Bezeichner (z.B.) "description"
als Wert.
Kann ich dem regex irgendwie beibringen, dass er das Ergebnis schon so ordnet,
dass er immer erst "name" im Ergebnisarray vor dem "content" einordnet?

Grüße!
pepe24 ist offline  
Alt 30.05.2008, 09:14  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Wuesste nicht wie, was spricht denn gegen den Einsatz von SimpleXML?
Zergling-new ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Bestimme HTML Tags mittels RegEx rausfiltern Mano PHP Tipps 2008 6 27.09.2007 14:22
[Erledigt] Regex für alle Tags auf Level 1 Andreas PHP-Fortgeschrittene 4 16.11.2006 07:58
xml tags auslesen LP PHP Tipps 2006 2 14.09.2006 23:34
Webseite komplett auslesen PHP Tipps 2006 5 20.07.2006 12:49
Webseite auslesen Katrin PHP Tipps 2006 6 21.04.2006 20:43
Wie Tonerstand aus Webseite vom Druckergerät auslesen? PHP Tipps 2006 14 16.03.2006 16:16
RegEx nicht für Tags stefanjann PHP Tipps 2006 2 16.03.2006 10:58
eMail Adressen einer Webseite auslesen ? madSoul PHP Tipps 2005-2 10 08.09.2005 12:17
Mit RegEx auslesen - Hilfe beinm RegEx Monty77 PHP-Fortgeschrittene 6 09.06.2005 14:34
META TAGS in php? GrU3nL!nG PHP Tipps 2005-2 19 05.06.2005 13:15
binäre id3v2 tags auslesen mrSpok PHP-Fortgeschrittene 5 03.06.2005 12:56
musst man &uml; in meta tags verwenden? HTML, Usability und Barrierefreiheit 16 24.02.2005 17:50
[Erledigt] html aus einer webseite auslesen PHP-Fortgeschrittene 7 14.02.2005 11:03
[Erledigt] meta refresh beim auslesen aus einer Datenbank umgehen Datenbanken 1 14.09.2004 20:10
[Erledigt] Meta Tags HTML, Usability und Barrierefreiheit 5 02.08.2004 09:29

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php meta tags auslesen, regex metatags, metatags auslesen, php metatags auslesen, http://www.php.de/php-tipps-2008/45842-regex-auslesen-der-meta-tags-einer-webseite-sucheingrenzung.html, regex meta description, meta tags auslesen, meta tags auslesen php, regex meta, metatags auslesen php, php regex meta tags, regex meta tag, php metatag auslesen, php regex meta description, meta tags regex, metatag regex, regex metatag, regex meta tags, regular expression meta description, meta regex

Alle Zeitangaben in WEZ +2. Es ist jetzt 19:21 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.