2017-07-20 2 views
2

Regex ist nicht meine Stärke, und ich könnte dies überkompensieren, aber ich habe es geschafft, ein Muster zu entwickeln, das meinen Bedürfnissen entspricht.Wie ersetzt man die Gruppenübereinstimmung, hält alles andere intakt?

\[img.*\].*photobucket.*(.jpg)\[\/img.*\] 

Hier ist eine Demo:

https://regex101.com/r/fo98tP/6

Ich wünsche das Gruppenspiel (das heißt ". jpg") mit ". jpg ~ Original" zu ersetzen.

Ich habe herausgefunden, wie die Übereinstimmungen mit preg_match_all zu bekommen, aber ich habe keine Ahnung, wie man die Substitution und injizieren sie wieder in den ursprünglichen Textblock.

Um etwas Hintergrund zu geben, ist dies zu versuchen und die neue hotlinking Politik umgehen und die Absicht ist für mein PHP-Skript durch alle Nachrichten in meinem phpBB Forum zu gehen und die Suche und ersetzen oben und aktualisieren Sie den Beitrag, wenn es ist war ein Spiel/Ersatz. Wenn es direkt in MySQL noch besser gemacht werden könnte, aber ich versuche zu laufen, bevor ich rennen kann!

Sehr schätzen jede Hilfe; mein Kopf tut weh!

Antwort

1

Ich glaube, Sie suchen nach preg_replace($pattern, $replacement, $text).

Also vorausgesetzt, Ihre Regex ist richtig, die es scheint zu arbeiten. (Persönlich würde ich ein paar kleinere Änderungen wie \[img.*\] zu \[img[^]]*\] ändern, aber das könnte nur eine Stilsache sein). Sie müssen lediglich zwei weitere Capture-Gruppen hinzufügen.

Damit können Sie diese Erfassungsgruppe als Ersatz verwenden.

Ganz einfach - Sie schreiben nur den übereinstimmenden Teil des Originaltextes neu, um das gewünschte "~ Original" einzufügen.

Der gesamte Code-Block könnte wie folgt aussehen:

$text = "Steering damper mounts finished - without the connecting rod the damper would get bent: 
[url=http://s557.photobucket.com/user/realboss7669/media 
/C85A0F5D-413D-4779-9F09- 
BD43BB798238_zpse8s6dxyu.jpg.html:jaeyh8wg] 
[img:jaeyh8wg]http://i557.photobucket.com/albums 
/ss16/realboss7669/C85A0F5D-413D-4779-9F09 
BD43BB798238_zpse8s6dxyu.jpg[/img:jaeyh8wg][/url:jaeyh8wg]"; 

$pattern = "/(\[img.*\].*photobucket.*)(.jpg)(\[\/img.*\])/i"; 

$replace = "$1$2~original$3"; 

$text = preg_replace($pattern, $replace, $text); 
+1

Danke, ich dachte nur, nie mehr Gruppen zu definieren! Danke für den Spaziergang und den eigentlichen PHP-Code. Ich habe tatsächlich den sln-Regex unten verwendet, obwohl mir scheint, dass nur 2 Gruppen statt 3 benötigt werden. Vielen Dank euch beiden! Ersparte mir viel Haarziehen. – willdashwood

1

Ja, Sie können ein globales tun ersetzen, nur richtige Einfanggruppen verwenden.

.jpg[/img:jaeyh8wg]
\ ^
Da Sie hier einfügen möchten, müssen Sie nur zwei Gruppen es aufzuteilen.

Auch, da Sie für die nächste Schließung suchen, besser zu verwenden
nicht-gierigen Quantoren .*?.

https://regex101.com/r/fo98tP/10

So ist es ein
Finden (\[img.*?\].*?photobucket.*?.jpg)(\[\/img.*?\])
ersetzen $1~original$2

+1

Danke für Ihre Eingabe. Diese Regex funktioniert perfekt. Ich habe Scotts Antwort einfach akzeptiert, da der PHP-Code eine absolut idiotensichere Antwort war. Danke vielmals! – willdashwood

Verwandte Themen