String nach bestimmten Keywords durchsuchen
Zenetti
- php
Hallo,
gibt es eine elegantere Methode um einen String nach bestimmten Keywords zu durchsuchen, als die folgende?
$Robots = Array("slurp", "xenu link", "googlebot", "robot");
foreach( $Robots as $dieserRobot ) {
if ( stristr($HTTP_USER_AGENT, $dieserRobot) ) {
echo "Ist ein Robot";
break;
}
}
Ich möchte damit herausfinden, ob der Zugriff auf die Seite von einem Robot stammt oder nicht. Da das Array sehr groß wird, denke ich, dass diese Methode sehr resourcenfressend ist und suche eine Alternative.
Vielen Dank
Chris
Hi,
gibt es eine elegantere Methode um einen String nach bestimmten Keywords zu durchsuchen, als die folgende?
ja: Mittels einer Regular Expression, welche alle Strings in sich verodert.
dass diese Methode sehr resourcenfressend ist
Regular Expressions sind ebenfalls nicht ganz ohne, das solltest Du beachten.
Cheatah
Hallo Cheatah,
ja: Mittels einer Regular Expression, welche alle Strings in sich verodert.
Also sowas?
if ( eregi("slurp|xenu|link|googlebot|robot", $HTTP_USER_AGENT) )
echo "Robot";
Ist die Zeilenlänge in PHP beschränkt? Es können an die 200 Begriffe werden, nach denen ich suche.
Regular Expressions sind ebenfalls nicht ganz ohne, das solltest Du beachten.
Was wird schätzungsweise mehr Resoucen bei 200 Begriffen fressen? Ich würde auf die RegEx tippen oder liege ich da falsch?
Ciao
Hi,
Also sowas?
ja.
Ist die Zeilenlänge in PHP beschränkt?
Das wäre mir neu, und ehrlich gesagt würde das ein _erheblicher_ Mangel sein. Probier's aus.
Was wird schätzungsweise mehr Resoucen bei 200 Begriffen fressen?
Mach 'nen Benchmark. Arbeite dabei mit kompilierten RegExp.
Cheatah
Hi Cheatah,
danke erst mal.
Mach 'nen Benchmark. Arbeite dabei mit kompilierten RegExp.
Habe einen mit 'eregi' gemacht und feststellen müssen, dass die Schleife schneller ist.
Was meinst du mit 'kompilierten' RegExp?
Habe auch einen Versuch mit 'preg_match' unternommen, allerdings habe ich dort noch Probleme mit dem Perl Syntax für das String Pattern.
Ciao
Hi,
Was meinst du mit 'kompilierten' RegExp?
Regular Expressions werden in maschinennahen Programmcode umgerechnet. Es genügt, wenn dies einmalig geschieht.
Habe auch einen Versuch mit 'preg_match' unternommen, allerdings habe ich dort noch Probleme mit dem Perl Syntax für das String Pattern.
Erstaunlich, üblicherweise ist es anders herum. Wo liegen Deine Probleme?
Cheatah
Hallo,
Regular Expressions werden in maschinennahen Programmcode umgerechnet. Es genügt, wenn dies einmalig geschieht.
Wo finde ich Informationen hierfür?
Wie sieht z.B. ein PHP Syntax einer kompilierten RegExp aus?
Habe auch einen Versuch mit 'preg_match' unternommen, allerdings habe ich dort noch Probleme mit dem Perl Syntax für das String Pattern.
Erstaunlich, üblicherweise ist es anders herum. Wo liegen Deine Probleme?
Äh, *schäm*.
preg_match("slurp|xenu|link|ht://dig|robot", $HTTP_USER_AGENT);
bringt folgende Warnung:
Warning: Delimiter must not be alphanumeric or backslash in test.php on line 3
Ich muss gestehen, dass ich bisher nur mit ereg gearbeitet habe und deshalb keine Erfahrung mir Perl RegExp habe.
Ciao
Hi,
Wie sieht z.B. ein PHP Syntax einer kompilierten RegExp aus?
das weiß ich nicht. Ich kenne das Prinzip nur grundsätzlich, aus anderen Sprachen.
preg_match("slurp|xenu|link|ht://dig|robot", $HTTP_USER_AGENT);
Warning: Delimiter must not be alphanumeric or backslash in test.php on line 3
Links und rechts der RegExp muss ein Begrenzer sein; standardmäßig wird "/" gewählt, andere (z.B. "^") sind aber oft sinnvoll - beispielsweise, damit Du "ht://dig" nicht escapen musst ;-)
Ich muss gestehen, dass ich bisher nur mit ereg gearbeitet habe und deshalb keine Erfahrung mir Perl RegExp habe.
Sie werden üblicherweise pauschal als besser bezeichnet.
Cheatah