| 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! |
 |
|

02-10-2009, 14:09
|
|
chefdesigner
Registrierter Benutzer
|
|
Registriert seit: Oct 2003
Ort: Bayern
Beiträge: 257
|
|
URL's ersetzen
Okay, ich hab mal wieder eine Blockade und komm einfach nicht auf die Lösung.
Folgendes Problem:
Ich möchte in einem Text alle URL's, die folgenden Aufbau besitzen:
HTML-Code:
<a href="/pfad-der-daten/hersteller/produkt/id.html">
durch folgende URL's:
HTML-Code:
<a href="/hersteller-produkt/id/
ersetzen.
Nun habe ich das mit folgendem Konstrukt gelöst (dachte ich):
PHP-Code:
$text = preg_replace('#\/([_a-zA-Z0-9\-]{1,255})\/([_a-zA-Z0-9\-]{1,255})\/([_a-zA-Z0-9\-]{1,255})\/([0-9]{1,4}).html#', $neuer_link, $text);
Ich dachte: juhu, das wars, funktioniert. Allerdings werden verschiedene Hersteller bzw. Produkte immer durch den jeweils ersten Link überschrieben. Beispiel:
HTML-Code:
<a href="/pfad-der-daten/hersteller1/produkt50/5001.html">
<a href="/pfad-der-daten/hersteller2/produkt30/2005.html">
<a href="/pfad-der-daten/hersteller3/produkt26/2895.html">
Diese Links werden alle durch folgenden Link ersetzt:
HTML-Code:
<a href="/hersteller1-produkt50/5001/">
Wo liegt mein Denkfehler und wie kann ich das Problem lösen?
__________________
Das Genie überblickt das Chaos!
Wer Rechtschreibfehler findet, darf sie behalten!
|

02-10-2009, 14:17
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
Hallo,
wie lautet der Inhalt von $neuer_link?
Gruß,
Amica
|

02-10-2009, 14:23
|
|
chefdesigner
Registrierter Benutzer
|
|
Registriert seit: Oct 2003
Ort: Bayern
Beiträge: 257
|
|
PHP-Code:
if ( ereg ( '\/([_a-zA-Z0-9\-]{1,255})\/([_a-zA-Z0-9\-]{1,255})\/([_a-zA-Z0-9\-]{1,255})\/([0-9]{1,4}).html', $text, $regs ) ) { $query = mysql_query("SELECT * FROM `tabelle` WHERE `id`='".$regs[4]."'"); $row = mysql_fetch_array($query); $id = $row['id']; $hersteller_link = str_replace(' ', '-', $row['hersteller']); $produkt_link = str_replace(' ', '-', $row['produkt']); $hersteller_link = strtolower($hersteller_link); $produkt_link = strtolower($produkt_link); $neuer_link = "/".$hersteller_link."-".$produktl_link."/".$id."/"; $message = preg_replace('#\/([_a-zA-Z0-9\-]{1,255})\/([_a-zA-Z0-9\-]{1,255})\/([_a-zA-Z0-9\-]{1,255})\/([0-9]{1,4}).html#', $neuer_link, $text); }
__________________
Das Genie überblickt das Chaos!
Wer Rechtschreibfehler findet, darf sie behalten!
Geändert von chefdesigner (02-10-2009 um 14:28 Uhr)
|

02-10-2009, 14:32
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
Achso, der RegExp passt auf alle URLs, aber du willst ja pro Datensatz nur eine ersetzen. Nach der ersten Row sind aber alle ersetzt und dann passt dafür der Suchausdruck nicht mehr, weil eine Verzeichnisebene weniger da ist. Warum nimmst du denn überhaupt preg_replace? Wenn dir die ganzen Namen und Nummern aus der DB bekannt sind, kannst du doch direkt mit str_replace ersetzen. Oder du machst es ohne DB und ersetzt mit Backreferences.
|

02-10-2009, 14:49
|
|
chefdesigner
Registrierter Benutzer
|
|
Registriert seit: Oct 2003
Ort: Bayern
Beiträge: 257
|
|
@AmicaNoctis:
Ich hätte es nicht treffender formulieren können. Genau das ist mein Problem.
Ich fürchte ich steh gerade tierisch auf dem Schlauch, das Ganze nervt mich nun schon Stunden. Könntest du mir bitte einen Tipp geben, wie du das machen würdest. Ich wollte halt nicht alle 50 (oder mehr) Hersteller etc. aufzählen.
Wäre dir für nen Tipp sehr dankbar.
__________________
Das Genie überblickt das Chaos!
Wer Rechtschreibfehler findet, darf sie behalten!
|

02-10-2009, 14:52
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
Da wären noch ein paar Fragen zu klären: gibt es in der Seite auch Links, die nicht ersetzt werden dürfen? Wenn ja, wie unterscheiden sich die konkret von den Produkt-URLs? Könnte man ohne Kenntnis der Datenbank nur aufgrund der alten URL die neue konstruieren oder würden dann Informationen fehlen? Fragst du die Datenbank nur für diese Ersetzungen ab oder benutzt du die Datensätze ohnehin in der Seite?
|

02-10-2009, 15:03
|
|
chefdesigner
Registrierter Benutzer
|
|
Registriert seit: Oct 2003
Ort: Bayern
Beiträge: 257
|
|
Zitat:
|
gibt es in der Seite auch Links, die nicht ersetzt werden dürfen?
|
Ja, die gibt es. Es müssen einmal die oben erwähnten Links behandelt werden und zusätzlich noch folgende:
.../hersteller1_produkte.html
die in folgende Links geändert werden sollen:
.../hersteller1-produkte/
Ansonsten kommen auch noch andere Links vor, die alle ersatzlos gelöscht / durch nichts ersetzt werden sollen.
Zitat:
|
Wenn ja, wie unterscheiden sich die konkret von den Produkt-URLs?
|
Hmm, die haben einen anderen Aufbau, wie der aussieht kann ich nicht beschreiben, da es theoretisch externe Links sein können oder interne mit unterschiedlichstem Aufbau. -> sollen alle gelöscht werden
Zitat:
|
Könnte man ohne Kenntnis der Datenbank nur aufgrund der alten URL die neue konstruieren oder würden dann Informationen fehlen?
|
Wichtig ist eben die ID, anhand der man dann die neuen konstruieren könnte.
Zitat:
|
Fragst du die Datenbank nur für diese Ersetzungen ab oder benutzt du die Datensätze ohnehin in der Seite?
|
Eigentlich nur für die Ersetzung, da ich mich da nicht auf die alten Links "verlassen" will. Lediglich die ID ist 100% korrekt, der Rest könnte Fehler enthalten. Die neuen Links sollten also nicht auf Basis der alten umgeschrieben werden, sondern mit den Daten aus der Datenbank.
__________________
Das Genie überblickt das Chaos!
Wer Rechtschreibfehler findet, darf sie behalten!
|

02-10-2009, 15:20
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
Zitat:
Zitat von chefdesigner
Hmm, die haben einen anderen Aufbau, wie der aussieht kann ich nicht beschreiben, da es theoretisch externe Links sein können oder interne mit unterschiedlichstem Aufbau. -> sollen alle gelöscht werden
|
Kann es passieren, dass externe Links auch auf eine existierende ID passen könnten?
Beispiel:
/pfad-der-daten/hersteller/produkt/53.html (ID = 53, wird ersetzt)
/fiese_externe_URL/die_auch/passen_wuerde/53.html (genau gleiches Schema, soll aber nicht ersetzt werden)
Edit: mir wird grad klar, dass ich totalen Blödsinn schreibe. Externe URLs würde man ja am http:// erkennen.
Edit2:
wie wäre es mit
PHP-Code:
$text = preg_replace("!^/[^/]+/[^/]+/[^/]+/" . $id . "\.html$!", $neuer_link, $text);
Geändert von AmicaNoctis (02-10-2009 um 15:27 Uhr)
|

02-10-2009, 15:27
|
|
chefdesigner
Registrierter Benutzer
|
|
Registriert seit: Oct 2003
Ort: Bayern
Beiträge: 257
|
|
Zitat:
Kann es passieren, dass externe Links auch auf eine existierende ID passen könnten?
Beispiel:
/pfad-der-daten/hersteller/produkt/53.html (ID = 53, wird ersetzt)
/fiese_externe_URL/die_auch/passen_wuerde/53.html (genau gleiches Schema, soll aber nicht ersetzt werden)
Edit: mir wird grad klar, dass ich totalen Blödsinn schreibe. Externe URLs würde man ja am http:// erkennen.
|
Genau, das könnte zwar passieren, kann man aber über das Abfragen der Domain abfangen.
__________________
Das Genie überblickt das Chaos!
Wer Rechtschreibfehler findet, darf sie behalten!
|

02-10-2009, 16:07
|
|
chefdesigner
Registrierter Benutzer
|
|
Registriert seit: Oct 2003
Ort: Bayern
Beiträge: 257
|
|
Boa, hatte nicht gesehen, dass du deinen Beitrag editiert hattest. ;-)
So, ich hab's ausprobiert, jetzt hab ich aber das Problem, dass er nur das erste vorkommen ersetzt und die anderen ignoriert?
Ich denke ich bräuchte da irgendwie ne Schleife, die ich dann über alle vorkommen drüber jage. Aber irgendwie hab ich grad ein Brett vor dem Kopf.
Könntest du mir noch nen Tipp geben?
__________________
Das Genie überblickt das Chaos!
Wer Rechtschreibfehler findet, darf sie behalten!
|

02-10-2009, 16:21
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
Natürlich brauchst du eine Schleife, sonst holst du ja nur den ersten Datensatz aus der Tabelle, üblicherweise sieht das so aus:
PHP-Code:
$query = "select ...";
$result = mysql_select($query, $link);
while ($row = mysql_fetch_XXX($result)) {
// mach was mit $row
}
Ersetze XXX durch assoc, object, array oder row. Je nachdem, aber assoc ist prima.
|

02-10-2009, 16:48
|
|
chefdesigner
Registrierter Benutzer
|
|
Registriert seit: Oct 2003
Ort: Bayern
Beiträge: 257
|
|
Okay, vielen Dank für den Tipp. War Gold wert. Hatte echt ne Blockade. Manchmal ist die Lösung einfacher als man denkt.
Hier nun meine funktionierende Lösung:
PHP-Code:
$query = mysql_query("SELECT * FROM `tabelle` ORDER BY `id` DESC");
while($row = mysql_fetch_array($query)) {
$id = $row['id'];
$hersteller_link = str_replace(' ', '-', $row['hersteller']);
$produkt_link = str_replace(' ', '-', $row['produkt']);
$hersteller = $hersteller_link;
$hersteller_link = strtolower($hersteller_link);
$produkt_link = strtolower($produkt_link);
$neuer_link = "/".$hersteller_link."-".$produkt_link."/".$id."/";
$link_hersteller = "/".$hersteller_link."-produkte/";
$message = preg_replace('#\/([_a-zA-Z0-9\-]{1,255})\/([_a-zA-Z0-9\-]{1,255})\/([_a-zA-Z0-9\-]{1,255})\/'.$id.'.html#', $neuer_link, $message);
$message = preg_replace('#\/'.$hersteller.'_produkte.html#', $link_hersteller, $message);
}
Jetzt hätte ich nur noch folgende Frage: wie könnte ich denn jetzt nur relevante ID's abfragen? Denn momentan läuft die while-Schleife über alle Datensätze (mehrere tausend Stück), obwohl pro Text etwa nur 5 bis 10 verschiedene Produktlinks bzw. Herstellerlinks vorkommen.
Eine Idee wie ich das Lösen könnte?
__________________
Das Genie überblickt das Chaos!
Wer Rechtschreibfehler findet, darf sie behalten!
|

02-10-2009, 17:03
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
Zitat:
Zitat von chefdesigner
Eine Idee wie ich das Lösen könnte?
|
Ja, mit preg_match_all in Frage kommende URL-IDs auswählen und aus dem Ergebnisarray eine WHERE-IN-Klausel für die Abfrage erzeugen.
|

02-10-2009, 17:54
|
|
chefdesigner
Registrierter Benutzer
|
|
Registriert seit: Oct 2003
Ort: Bayern
Beiträge: 257
|
|
Nochmals besten Dank, für deine Hilfe.
Hat alles wunderbar funktioniert!
Wenn du mir jetzt noch nen Ansatz zum Löschen aller verbliebenen Links lieferst, dann mach ich dich zum Helden.
__________________
Das Genie überblickt das Chaos!
Wer Rechtschreibfehler findet, darf sie behalten!
|

02-10-2009, 18:12
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
Zitat:
Zitat von chefdesigner
Wenn du mir jetzt noch nen Ansatz zum Löschen aller verbliebenen Links lieferst
|
Beim Ersetzen mit DB-Daten fügst du ein bestimmtes Sonderzeichen ein, z. B. \x01. Dann entfernst du mit preg_replace alle Links, die es nicht enthalten. Danach entfernst du es wieder.
Zitat:
Zitat von chefdesigner
dann mach ich dich zum Helden.
|
Nicht, dass ich das nötig hätte, aber ich frag mich grad wie du das machen willst.
|
|
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
|