Aiuto con Regex - Wordpress (search-regex)
Domanda
Il mio primo tentativo di utilizzare RE mi ha bloccato. Sto usando Regex su un sito Web Wordpress tramite il Search-Regex Plugin e devo abbinare su uno specifico " sepolto in un mucchio di codice html. Esempio HTML:
provide brand-strengthening efforts for the 10-school conference.  </p>
<p>
<a href="http://www.learfield.com/oldblog/.a/6a00d8345233fa69e201157155a6fc970c-pi">
<img alt="MOvalleyConf500"
border="0"
class="at-xid-6a00d8345233fa69e201157155a6fc970c"
src="http://www.learfield.com/oldblog/.a/6a00d8345233fa69e201157155a6fc970c-800wi"
style="border: 1px solid black; margin: 0px; width: 502px; height: 384px;"
title="MOvalleyConf500" />
</a>
</p>
<p>The photo above
Nell'esempio sopra, ci sono tre target
6a00d8345233fa69e201157155a6fc970c-pi"
6a00d8345233fa69e201157155a6fc970c"
6a00d8345233fa69e201157155a6fc970c-800wi"
Il Regex che sto usando è /6a00d834.*?"/
li individua, tuttavia voglio solo abbinare il "
finale e non il intera stringa. Queste sono immagini a cui manca la loro estensione di file, quindi devo sostituire il finale " con .jpg " Capisco la parte sostitutiva dell'espressione, è la corrispondenza iniziale con cui ho problemi.
Ne ho un sacco di questi (221), tutti gli obiettivi iniziano tutti con 6a00d834
quindi alcuni alfanumerici casuali che terminano con un "
Apprezzo qualsiasi intuizione. Grazie.
Modifica aggiunta dal commento di OP : attualmente è su un sito Wordpress che utilizza un plug-in (REGEX) per eseguire query e sostituire i dati all'interno di SQL. Posso usare qualsiasi regex compatibile Perl. (Nota dell'editor - a seconda del plug-in, molto probabilmente non utilizza effettivamente Perl ma l'implementazione di PCRE di PHP.)
Soluzione
La sostituzione della stringa può essere eseguita insieme alla corrispondenza. Dato che stai usando PHP, usa preg_replace
$newstring = preg_replace("/(6a00d834.*?)(\")/", "\\1.jpg\\2", $oldstring)
Ciò interrompe la corrispondenza in due gruppi, quindi inserisce '.jpg' tra loro.
Per il plug-in regex wordpress , utilizzare /(6a00d834.* ?) (") / per la stringa di corrispondenza, quindi usa \ 1.jpg \ 2 per la stringa di sostituzione.
Altri suggerimenti
Non funzionerebbe?
/(6a00d834.*?)"/
Modifica: in uno dei tuoi commenti hai detto di voler sostituire il "
con .jpg "
; in tal caso, probabilmente questa regexp funzionerebbe:
/6a00d834.*?(")/
Tuttavia, la cosa migliore da fare è probabilmente usare la prima regexp che ho fornito e usare una stringa di sostituzione che assomigli a questa:
'\\1.jpg"'
Ovviamente, \\ 1
deve essere sostituito con qualunque cosa il tuo particolare motore regexp utilizzi per i riferimenti indietro.
La tua domanda non è del tutto chiara, ma forse intendi:
/6a00d834[^"]*"/
(Ovvero: corrispondenza 6a00d834 seguita da zero o più caratteri che non sono un " seguito da un ")
In alternativa, se è disponibile nel motore regex che stai utilizzando, puoi utilizzare un identificatore non avido per limitare il meta-carattere '*'. Tieni presente che qualsiasi domanda su regex dipende dal motore che stai utilizzando. Ad esempio:
$ cat input 6a00384foo" more" $ perl -ne '/(6a00384[^"]*")/; print "$1\n"' input 6a00384foo" $ perl -ne '/(6a00384.*?")/; print "$1\n"' input 6a00384foo" $ sed 's/\(6a00384[^"]*"\).*/\1/' input 6a00384foo" $ sed 's/\(6a00384.*?"\).*/\1/' input 6a00384foo" more"
Notare che il '?' non funge da specificatore non avido in sed.
Presumo che tu voglia estrarre tutto dopo 6a00d834
fino al primo "
successivo. Quindi prova questo:
/6a00d834([^"]*)"/
La corrispondenza del primo raggruppamento sarà la stringa che stai cercando.
Forse usi un operatore di gruppo?
/6a00d834.*?(")/
Quindi, a seconda dell'API regex, puoi estrarre esattamente ciò che corrisponde nelle parentesi.
Modifica
Ah, vuoi fare la sostituzione della stringa. Immagino che stai usando Perl. Prova questo:
s/(6a00d834.*?)(")/\1.jpg\2/