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.&#0160; </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.)

È stato utile?

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/
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top