Programm zur Überprüfung, ob Keywords öfter als einmal in Website aufscheinen

tina33333

Mitglied
Bastle schon seit geraumer Zeit an einem Programm, welches mir ausgeben soll wie oft keywords in einer Website vorkommen bzw. ob sie öfter als 1x vorkommen; leider funktioniert das Programm nicht und ich weiß nicht wo der Fehler liegt.

Hier der Code:
PHP:
$urls="http://www.almhof-kirchberg.com";
$keywords="Hotel";

$contents = file_get_contents($urls);
	echo research ($urls, $contents, $keywords);

function research($url, $content, $keyword) {	

preg_match_all("/$keyword/i", $content, $matches);
print_r($matches);
$ergebnis=count($matches);
echo $ergebnis.'<br/>'; #hier wird falsch gezählt******


#echo "<p>Im Array befinden sich Eintr&auml;ge: $ergebnis";
	foreach ($matches as $kw=>$value) {
	print $kw."<br />"; 
	}

#return $ergebnis;
	if ($kw <1) {
		return 0;
	}
	else {
		return 1;
	}
	
}

Danke im Voraus für eure Mühe!
LG
Tina
 
Hast du dir die Mühe gemacht manuell zu ermitteln welches Ergebnis herauskommen müsste?

Ich bekomme mit substr_count die Zahl 27!
 
Hi Tombe,
bei mir kommt mit print_r das Ergebnis, dass das Keyword "Hotel" 68x aufscheint.
Ich verstehe auch nicht, warum die Umwandlung vom Array in den String mit der foreach-Schleife nicht funktioniert. Die foreach-Schleife werde ich ja sicherlich benötigen, damit die darauffolgende Bedingung das richtige Ergebnis ausspuckt, oder?
 
In einem deiner vielen Beiträge hast du ja schon selber bemerkt das auf diese Art nicht nur der Inhalt der am Bildschirm zu sehen ist durchsucht wird sondern der komplett HTML-Code.

HTML:
<img src="hotelbild.jpg" id="hotel">

Obiger Code liefert also schon 2 Treffer ohne das sie auf den ersten Blick zu erkennen sind!

Was du mit $kw erreichen willst ist mir nicht so ganz klar.
 
Danke, Tombe, für deine rasche Antwort.
$kw soll eigentlich nur in der foreach-Schleife den Array in einen String umwandeln, damit ich eine if-Bedingung machen kann, welche mir ausgibt, dass das Keyword öfter als einmal in der Website auftaucht.

Hallo, liebe Experten,

ich hab jetzt schon so vieles ausprobiert und mir kommt vor, dass ich mich von der Lösung eher wegbewege. Meine Probleme:
Ich muss ja zum Ergebnis kommen, dass mir das Programm sagen kann, ob das eingegebene Keyword öfter als 1x im content vorkommt.
Damit ich dies feststellen kann, muss ich ja wahrscheinlich das Array in einen String verwandeln (oder gibt es da eine andere Möglichkeit?), damit ich dann mit der If-Bedingung überprüfen kann, ob das keyword öfter als einmal im Text vorkommt. Das habe ich mit foreach gemacht, nur funktioniert das nicht und ich weiß nicht wieso.Implode funktioniert auch nicht. Weiß echt nicht mehr, was ich da noch ausprobieren könnte.
 
Fangen wir nochmal ganz am Anfang an.

Wie sieht den jetzt der Text aus den du überprüfst. Sind da jetzt sämtliche HTML, CSS oder Javascript Anweisungen entfernt oder nicht?

Wenn nicht wirst du mit Sicherhheit davon ausgehen können das dein Ergebnis (zumindest häufig) nicht stimmt. Warum habe ich dir ja in Beitrag #4 gezeigt.

Also nochmal die Frage, wie sieht der Text aus der durchsucht wird?
 
Ich würde erstmal versuchen Schreibtext herauszufiltern. Wenn die Seite sauber programmiert ist, dann sollte Lauftext in <p>..</p>-Tags stehen, dann nehmen wir noch die Überschriften dazu, also <h[1-5]{1}).

Hier als Beispiel: http://regexp-tester.mediacix.de/t474

Danach wendest Du Dich diesen Funden in $fund[0] zu, in jenen suchst Du nach "Hotel". Das sind jetzt nur noch 6 Funde. Ist das jetzt nicht realistischer als über alles rüber zu bügeln?

mfg chmee
 
bei html5 gehen die <h[1-5]> Tags nichtmehr nur bis 5 sondern sind unbegrenz also da kann jede Zahl stehen.
Und das mit den <p> tags ist auf den meisten Seiten nicht der fall (wäre ja sonst auch zu leicht^^).

Ich habe tina33333 in einem anderen Thread das Filtern so gebastelt:
PHP:
// EDITIER BEREICH

$url         = "...";        // zu durchsuchende Webseite


// QUELLTEXT HOLEN

$quelltext = file_get_contents($url);
$enthalten = false;


// FILTERN DES QUELLTEXTES

$quelltext = preg_replace('/(<script[^>]*>.*?<\/script>|<style[^>]*>.*?<\/style>)/msi', '', $quelltext);
$quelltext = strip_tags($quelltext);
$quelltext = preg_replace('/(\n|\r|\t|\s|\.|\+|-|_)/msi', '{SPLIT}', $quelltext);
while(preg_match('/\{SPLIT\}\{SPLIT\}/msi', $quelltext))
    $quelltext = preg_replace('/\{SPLIT\}\{SPLIT\}/msi','{SPLIT}', $quelltext);

Dabei filtere ich erst im Quelltext stehende JavaScripts und Stylesheets da diese mit Sicherheit keine relevanten Texte enthalten bzw. aufjeden fall mehr Wörter die nichts mit dem Seiteninhalt zutun haben.
Dann entferne ich alle übrig gebliebenen HTML Tags bevor ich alle sonderzeichen usw. ersetze durch eine Zeichenkette die Wörter von einander Trennen.
Danach entferne ich doppelte vorkommen der Zeichenkette zum Trennen.


nach dem Filtern habe ich dan die Einzelnen Wörter in ein Array gelegt:
PHP:
$words = explode("{SPLIT}", $quelltext);


Die Meta Tags habe ich extra über
PHP:
$metatags = get_meta_tags($url);
geholt, da diese vorher aus dem Quelltext gefiltert wurden durch
PHP:
strip_tags();
davon abgesehen kann man die leichter behandeln über
PHP:
$metatags = get_meta_tags($url);

Hier nochmal der andere Thread: http://www.tutorials.de/php/392685-...n-100-woertern-einer-website-ueberprueft.html





Es dürfte also nurnoch um bessere Lösungen und das doppelte vorkommen eines nahezu Identischen/Identischen Strings in einem Array.

Mir fallen da gerade nur lösungen mit 2 Schleifen in einander ein,
nicht gerade Performant.. hat da jemand was besseres?
Wenn nicht:
PHP:
for($i = 0; $i < sizeof($words); $i++)
{
	$start = $i+1;
	$counter = 1;
	for($j = $start; $i < sizeof($words); $j++)
	{
		if( @eregi($words[$i], $words[$j]) || @eregi($words[$j], $words[$i]) ) $counter++;
	}
	if($counter > 1) echo $words[$i] . 'ist ' . $counter . ' mal enthalten.<br>';
}

@chmee: Aber an sich hast du nicht unrecht würden alle Seiten sauber schreiben dan würde deine Variante viel schöner sein.
Muss leider zugeben das bei mir der Text zumeist auch nicht in <p> Tags landet (auf meiner Seite) sollte ich vielleicht auch mal ändern.^^
 
Da es momentan um genau diese eine Seite geht, hab ich natürlich nachgeschaut - und irgendein CMS liefert das Zeug aus, und Ja, Lauftext liegt in <p>'s. :) Ach ja, keine Sorge, <p> vergesse ich auch immer wieder :)

Zum Thema nochmal:

Die zweite Regex kann ja um alle Suchwörter via | erweitert werden, dann erhält man eine ungeordnete Liste aller Funde. Die schreibt man um in ein key/value-Array. Fertig ist eine sortierbare Liste der Keywords. Am Ende sind es also zwei Regex-Matches und eine Foreach.


mfg chmee
 
Zurück