2009-07-24 8 views
0

Ich habe eine Reihe von URLs in statischen HTML-Dateien, die geändert werden müssen.Hilfe mit Regex ersetzen in PHP

Sie jetzt so aussehen:

 
<img src="/foldera/folderb/folderc/images/imgxyz.jpg" /> 

Sie müssen wie folgt aussehen:

 
<img src="imgxyz.jpg" /> 

Also, ich habe gerade ein PHP-Skript geschrieben, dass jeder und macht einen preg_replace öffnet().

Meine regex (mit Doppel entkam Schrägstriche, ja):


$regex = '/<img src="\\/foldera\\/folderb\\/folderc\\/images\\/([^"]*)" \\/>/' 

$replacement = '<img src="$0" />' ; 

So bin ich nur nach/Bilder bis zum Schlusskurs Erfassung nichts.

Aber was ich bekommen, ist so etwas wie:

 
<img src="<img src="/foldera/folderb/folderc/images/imgxyz.jpg" />" /> 

Es scheint, die Capture-Gruppe ist übereifrige und ... oder etwas nicht mit dem/FolderA/FolderB Teil entsprechen.

Was geht hier vor?

+0

Sie könnten nur die ‚Basisnamen‘ Funktion verwenden. –

+0

Bitte, ersparen Sie uns das "Gefällt mir". Geben Sie uns die genaue ursprüngliche und verarbeitete Linie, die Ihnen Probleme bereitet. –

Antwort

5

Verwenden Sie $1 für den Ersatz. $0 entspricht dem gesamten Muster. Sie wollen die erste Gruppe.

$regex = '/(<img src=")([^"]*)"(\\/>)/e'; 

$replacement = "stripslashes('\$1').basename(stripslashes('\$2')).stripslashes('\$3')"; 
+0

oh, b'doy. Danke :) – bobobobo

+0

Würden Sie sich mit der Funktion basename beruhigen? es ist nicht so gut, wirklich. – bobobobo

+1

** @ bobobobo: ** 'basename()' ist fantastisch! Es kann mir erstaunliche Rückenmassagen geben, wenn ich sie brauche! –

0
  • Ändern Sie den Index 1, als Index 0 auf die gesamte abgestimmte Zeichenkette bezieht sich:

    $replacement = '<img src="$1" />' ; 
    

    Ein noch besserer Weg basename als Teil Ihrer Ersatz zu verwenden wäre oder

  • Verwenden Sie die Funktion "Basisname" oder

  • Verwenden Sie die folgenden Schritte aus:

    $ regex = '//'

In diesem Fall können Sie den Index ändern müssten bis 2.

1

Wie Nebenbei bemerkt, jetzt, Die Frage wurde beantwortet: Wenn Sie in der Regex '/' Schrägstriche haben, erzwingt die Verwendung von Schrägstrichen als Begrenzer, dass Sie innerhalb des Regex wie in dem von Ihnen vorgeschlagenen Beispiel entkommen:

$regex = '/<img src="\\/foldera\\/folderb\\/folderc\\/images\\/([^"]*)" \\/>/' 

Es macht wirklich tkings schwerer zu verstehen/ändern/halten :-(

Sie ein anderes Zeichen als Trennzeichen verwenden kann, solange sie die gleichen am Anfang und am Ende der Regex sind. Zum Beispiel, in einer solchen Situation verwenden die Menschen oft ‚#‘, so ziemlich wie folgt aus:

$regex = '#<img src="/foldera/folderb/folderc/images/([^"]*)" />#' 

Einfacher zu lesen, nicht wahr?

(Natürlich, wenn Sie ‚#‘ innerhalb der Regex, du wirst sie fliehen müssen, als es das Trennzeichen ist)

+0

ordentlich! Ich dachte nur "das ist nicht perl ..." – bobobobo

+0

Perl würde mehr Spaß machen :-p –