| PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Post your PHP questions here! |
 |

04-03-2010, 12:04
|
|
teco2008
Registrierter Benutzer
|
|
Registriert seit: Jan 2010
Beiträge: 14
|
|
[REGEX]preg_replace modifier & Code Ausführung
Hallo zusammen,
ich habe einen String der HTML und PHP Code enthält, dieser wird durchsucht, für eine Suchmaschine ohne Index.
Bisher ersetze ich via preg_replace darin vorkommenden PHP Code wie z.B.
PHP-Code:
<? include("news.php"); ?>
da dieser in Suchergebnissen unerwünscht wäre und somit ausgeschlossen wird.
Nun ist mir aber aufgefallen, dass der inkludierte HTML Output den news.php ausgibt, sehr wichtig für die Suchergebnisse meiner kleinen Suchmaschine wären.
Meine Frage ist, ob es möglich ist, via preg_replace gefundenen PHP Code meines Suchmusters (also Code der innerhalb <? ?> steht) vor der Ersetzung auszuführen?
Bisher habe ich immer nur PHP Funktionen wie strtoupper oder ähnliches in Verwendung mit dem e Modifier gefunden.
Weitere Frage: wie sieht die Performance Beeinträchtigung bei solche Vorgehensweise aus?
Vielen Dank für Tipps,
Teco
Geändert von teco2008 (04-03-2010 um 12:10 Uhr)
|

04-03-2010, 12:08
|
unset
 Moderator
|
|
Registriert seit: Jan 2007
Ort: Düsseldorf
Beiträge: 3.778
|
|
Zum Eintausendsten mal: Wir haben hier Regeln, die müssen gelesen werden. Und wenn man das getan hat, dann weiß man, dass man Code-Tags zu benutzen hat!
Und was du genau machen willst habe ich auch nicht kapiert.
|

04-03-2010, 12:15
|
 |
onemorenerd
 Moderator
|
|
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.481
|
|
Ich habe zwar verstanden was dein Ziel ist, halte diesen Ansatz aber für eine schlechte Idee. Mal angenommen jemand sucht nach "und OR ein". Die Trefferliste dürfte so ziemlich jede Seite mit deutschem Text umfassen, also quasi deine komplette Site.
Um die Trefferliste anzuzeigen, willst du nun jeden Treffer (=Seite) ausführen? Das heißt du willst, um eine einzige Seite aufzubauen, alle Seiten einmal ausführen!?
Dann kannst du den Suchen-Button gleich mit "DOS this site" beschriften.
Übrigens wäre die Lösung recht einfach: Statt die Dateien von der Platte zu öffnen, müsstest du sie nur via HTTP laden. Dann wäre sie bereits ausgeführt. Aber wie gesagt, das ist Harakiri.
Bau lieber ein Google-Search Widget in deine Seite ein.
Geändert von onemorenerd (04-03-2010 um 12:21 Uhr)
|

04-03-2010, 12:19
|
|
teco2008
Registrierter Benutzer
|
|
Registriert seit: Jan 2010
Beiträge: 14
|
|
Zitat:
Zitat von unset
Zum Eintausendsten mal: Wir haben hier Regeln, die müssen gelesen werden. Und wenn man das getan hat, dann weiß man, dass man Code-Tags zu benutzen hat!
Und was du genau machen willst habe ich auch nicht kapiert.
|
Hallo unset, tut mir Leid, den include Befehl hatte ich einfach so von Hand schnell reingeschrieben.
Um es deutlicher zu machen: ist es via preg_replace und modifier e "on the fly" möglich beliebigen Code eines Strings auf den ein Suchmuster angewandt wird, auszuführen und den String damit zu "erweitern" bzw. "modifizieren" (Inhalt hinzufügen)?
|

04-03-2010, 12:21
|
|
teco2008
Registrierter Benutzer
|
|
Registriert seit: Jan 2010
Beiträge: 14
|
|
Nein nein... wow wirklich schwer zu erklären.
Ich habe einen Ordner mit Template Files, diese enthalten eigentlich ausschließlich HTML Content. Nur ein zwei Files haben eine simples Newsscript integriert, welches HTML ausgibt. Diese Inhalte sollen im String bevor gesucht wird, enthalten sein.
Die Eingabe des Benutzers hat damit nichts zu tun. Es geht lediglich um die Aufbereitung des Suchsstrings die immer stattfindet.
Google Search kommt nicht in Frage, die Suche funktioniert sonst perfekt
|

04-03-2010, 12:32
|
 |
onemorenerd
 Moderator
|
|
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.481
|
|
Na dann machs doch mit Modifier e. Oder noch schlimmer mit eval.
Aber wenn du in deinen Templates einfach so ein Newsscript per include einbinden kannst, dann kannst du dort auch beliebigen anderen Code stehen haben. Beispielsweise die Initialisierung von Variablen, die das Newsscript steuern. Wenn es heute noch nicht so ist, irgendwann kommts!
Es genügt daher nicht, nur das Newsscript auszuführen. Du musst die ganzen Templates ausführen. Templates müssen aber vorher befüllt werden. Wo kommen die Templatevariablen her? (View, Action, Controller, Routing hast du vermutlich alles nicht.) Irgendwie musst du für die Templates den Kontext herstellen, den es bei einem normalen Request hat. Das geht wahrscheinlich nur ... *trommelwirbel* ... mit einem Request. Ergo HTTP.
Kurzum: Wenn dein Newsscript komplett für sich allein funktioniert und es für alle Zeiten die einzige Ausnahme bleiben wird, dann /e. Sonst indizierte Suche, evtl. von extern (Google etc.)
Geändert von onemorenerd (04-03-2010 um 12:35 Uhr)
|

04-03-2010, 12:48
|
|
teco2008
Registrierter Benutzer
|
|
Registriert seit: Jan 2010
Beiträge: 14
|
|
Verstehe deine Sicht der Dinge
Gut der Anstoss mit eval() war schonmal Gold wert, danke dafür.
Einen HTTP Request abzubilden wäre das Schlaueste, leider aber nicht das schnellste, daher teste ich erstmal das böse eval.
Ich hoffe, damit keine Attackiermöglichkeit einzubauen... :-)
|

04-03-2010, 12:50
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
Zitat:
Zitat von teco2008
Ich hoffe, damit keine Attackiermöglichkeit einzubauen... :-)
|
Mit an Sicherheit grenzender Wahrscheinlichkeit schon.
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt? 
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke! 
|

04-03-2010, 12:57
|
|
teco2008
Registrierter Benutzer
|
|
Registriert seit: Jan 2010
Beiträge: 14
|
|
Würde es jetzt so machen:
PHP-Code:
$string = eval('?>' . file_get_contents('template.tpl') . '<?);
Im Template steht dann der Include Befehl.
Wäre preg_replace mit e sicherer? Kann jemand mir einen Hinweis geben wie ich einen include über /e machen könnte?
|

04-03-2010, 13:07
|
 |
onemorenerd
 Moderator
|
|
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.481
|
|
Um Himmelswillen, ich hab eval doch nicht genannt damit du es benutzt. Das sollte dich abschrecken.
Denk mal diesen Ansatz durch:
PHP-Code:
<?php $content = file_get_contents($templateFile); if (strpos('include("news.php");', $content)) { ob_start(); include 'news.php'; $news = ob_get_clean(); $content = str_replace('include("news.php");', '?>'.$news.'<?', $content); } // jetzt nach Suchbegriff in $content suchen
Wenn dein Newsscript nämlich wirklich so ein Spezialfall ist und sich daran niemals etwas ändern wird, dann ist dieser Ansatz sozusagen der darauf abgestimmte Spezialfall von eval.
Geändert von onemorenerd (04-03-2010 um 13:12 Uhr)
Grund: Was ist denn heute mit den PHP-Tags los?
|

04-03-2010, 22:21
|
 |
fireweasel
Registrierter Benutzer
|
|
Registriert seit: Sep 2008
Ort: At home
Beiträge: 680
|
|
Zitat:
Zitat von onemorenerd
Um Himmelswillen, ich hab eval doch nicht genannt damit du es benutzt. Das sollte dich abschrecken. 
|
Dieses Forum braucht dringend Ironie-Tags ...
@teco2008:
Du könntest die Aufgabenstellung in zwei Teile spalten.
1.) Ein "Indexing"-Script, welches in regelmäßigen Abständen oder nur dann, wenn sich was geändert hat, dein News-Script ausführt und die Ausgabe als Datei speichert:
PHP-Code:
<?php
// alle Ausgaben einfangen
ob_start();
// news.ph laden und ausfuehren
include('news.php');
// die Ausgaben in eine Datei speichern
file_put_contents('path/scan-me.txt', ob_get_clean());
?>
2.) Das eigentliche Suchscript greift nur auf die Index-Datei zu:
PHP-Code:
// (ausserst primitives Beispiel)
// "Index"-File laden
$haystack = file_get_contents(path/scan-me.txt);
// durchsuchen
if (FALSE !== strpos($haystack, $needle)) {
// ...
}
__________________
PHP-Code:
class Brick implements Throwable {
// ...
}
Geändert von fireweasel (04-03-2010 um 22:28 Uhr)
|

06-03-2010, 12:33
|
|
teco2008
Registrierter Benutzer
|
|
Registriert seit: Jan 2010
Beiträge: 14
|
|
@onemorenerd:
Danke für deinen Denkanstoss!!! Funktioniert nun perfekt, nur die Parameterreihenfolge von strpos musst du umdrehen
@fireweasel:
stimmt, auch ein netter Lösungansatz. Vor allem falls die Performance irgendwann zu wünschen übrig lässt, aber momentan schaffe ich das alles noch in 0,7 Sekunden. Ab einer Sekunde werde ich dann indexen
Eine Frage noch:
Bekomme nun folgenden Notice Error:
Notice: ob_end_flush() [ ref.outcontrol]: failed to delete and flush buffer. No buffer to delete or flush. in C:\xampp\xampp\htdocs\sqe33rfw\lib\search.php on line 153
Mein Source sieht nun so aus:
PHP-Code:
/* News System interner Praxis News */ include("fetchnews.php"); $news = ob_get_clean(); $string = str_replace('<?include("lib/fetchnews.php");?>', $news, $string); } if(strpos($string, '<?include("lib/fetchrss.php");?>')) { ob_start(); /* RSS Fetcher */ include("fetchrss.php"); $rss = ob_get_clean(); $string = str_replace('<?include("lib/fetchrss.php");?>', $rss, $string); }
Schönes Wochenende
T.
Geändert von teco2008 (06-03-2010 um 13:14 Uhr)
|

07-03-2010, 10:03
|
 |
onemorenerd
 Moderator
|
|
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.481
|
|
Du rufst in Zeile 153 eine Funktion auf, die einen Output Buffer schließen soll, ohne dass zuvor einer geöffnet wurde.
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
|
|
| Thema bewerten |
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
|
PHP News
|