Avatar billede moddi100 Seniormester
26. august 2008 - 20:06 Der er 12 kommentarer og
1 løsning

Regex og backreferences

Hej

Jeg har følgende regex:

preg_replace("/'?%s'?/", $replace, $str, 1);

Den skal så gerne udvides så at den også tager og erstatter "-tegn, men hvordan kan jeg lave det?

Havde tænkt mig noget i stil med dette:

preg_replace("/(['\"])?%s\1/", $args[$i], $sql, 1);

Det virker bare ikke hvis der ikke er ' eller ".
Hvordan kan det ellers laves?
Det skal være det samme tegn der står bagefter %s som før, der erstattes.

-Morten
Avatar billede jakobdo Ekspert
26. august 2008 - 20:14 #1
Hvad er det du gerne vil opnå ?
Avatar billede coderdk Praktikant
26. august 2008 - 20:19 #2
Prøv med \\1 eller $1 :)
Avatar billede moddi100 Seniormester
26. august 2008 - 20:41 #3
vil gerne have at man kan skrive f.eks.

"%s" eller '%s'

og den så erstatter det med en værdi. Det ligger inde i en funktion
Avatar billede jakobdo Ekspert
26. august 2008 - 20:55 #4
Er det så ikke noget ala: '/["\']?%s["\']?/'
Den vil erstatte '%s' og "%s"
Avatar billede moddi100 Seniormester
26. august 2008 - 21:01 #5
men den skal ikke erstatte '%s"
Hvilket den gør nu.
Avatar billede coderdk Praktikant
26. august 2008 - 21:02 #6
Mit forslag virker.
Avatar billede coderdk Praktikant
26. august 2008 - 21:04 #7
Illustration:

$txt = <<<EOT
en 'to' tre "fire" 'fem "seks" syv'
EOT;
echo preg_replace("#(['\"])(.*?)\\1#", "----\\2----", $txt);

returnerer efter hensigten

en ----to---- tre ----fire---- ----fem "seks" syv----
Avatar billede olebole Juniormester
26. august 2008 - 22:10 #8
<ole>

coderdk >> er hensigten mon ikke, at "seks" skal være ----seks----? Ellers forstår jeg ikke hensigten  =)

/mvh
</bole>
Avatar billede coderdk Praktikant
27. august 2008 - 00:09 #9
olebole, Det tror jeg ikke, for fem "seks" syv er inde i ' ;) Men det kan vel være han har formuleret spørgsmålet forkert, selvom han lader til at forstå hvad hans backreference skal gøre...
Anyway, hvor jeg har .*? har han %s så det er nok ikke relevant ;)
Avatar billede moddi100 Seniormester
27. august 2008 - 07:36 #10
Det skal erstattes hvis det står lige op til, altså følgende skal erstattes:
"%s" men ikke " %s"

Men har ikke lige haft tid til at prøve det af, men har jeg senere idag
Avatar billede moddi100 Seniormester
27. august 2008 - 11:37 #11
dette regex virker:
!/([\"']?)%s\\1/"

Hvorfor skal det være \\1 og ikke bare \1, er det fordi det escapes??

Tak for hjælpen allesammen. Coderdk, smid venligst et svar.
Avatar billede coderdk Praktikant
27. august 2008 - 11:48 #12
Yep det er pga escape, så \\1 eller $1 :)
Avatar billede moddi100 Seniormester
27. august 2008 - 11:58 #13
okay, viste jeg ikke den gjorde
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester