Avatar billede jensgram Nybegynder
15. januar 2004 - 12:46 Der er 10 kommentarer og
1 løsning

Preg_replace - men kun udenfor PHP-"tags"

Yo!

Jeg har lidt problemer med at lure, hvordan jeg gør følgende:

Jeg har et tekst-dokument, hvori der er noget <?php .. ?> (en artikel). Dette er fint nok, men nu vil jeg gerne markere alle variable ($noget) i dokument så de bliver skrevet med fed.

Jeg prøvede:

$file = preg_replace('/\$[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/', '<code style="font-weight: bold;">\\0</code>', $file);

[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]* er taget fra PHP-manualen. Problemet er dog, at jeg ikke vil matche variable indenfor <?php ... ?>. Hvordan undgår jeg det?

På forhånd tak!
Avatar billede erikjacobsen Ekspert
15. januar 2004 - 13:08 #1
Prøv

$udenfor=true;

function test($a) {
  global $udenfor;
print "$a\n";
  if ($a=="<?php") {
    $udenfor=false;
  } elseif ($a=="?>") {
    $udenfor=true;
  } elseif ($udenfor) {
    $a="<b>$a</b>";
  }
  return $a;
}


$file = preg_replace("/<\?php|\?>|\\$[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/se", "test('\\0')", $file);
Avatar billede erikjacobsen Ekspert
15. januar 2004 - 13:09 #2
Du skal nok lige fjerne

  print "$a\n";
Avatar billede jensgram Nybegynder
15. januar 2004 - 13:13 #3
Nå, er det dig igen ;)

Jeg tester lige
Avatar billede jensgram Nybegynder
15. januar 2004 - 13:18 #4
Hvis jeg indsætter det før den highlight-kode du hjalp med i går så virker det.

Men skal man lave den callback-funktion? Kunne man ikke bare lave en reg-exp?

- Hvis der er et <?php så skal der også være et ?>
- Så erstattes \$[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*

Eller er jeg helt galt på den?
Avatar billede jensgram Nybegynder
15. januar 2004 - 13:21 #5
Og hvorfor forresten \\ foran $
Avatar billede jensgram Nybegynder
15. januar 2004 - 13:24 #6
Jeg skal på arbejde nu, men jeg kigger forbi i aften.

Indtil videre skal du have tak for hjælpen.
Avatar billede erikjacobsen Ekspert
15. januar 2004 - 13:28 #7
Man kan da godt isoleret gøre dette, hvor vi sparer $udenfor. Men dette er ikke dit
sidste spørgsmål i den retning, så måske ender du fornuftigvis med en funktion. Men prøv:

$file = preg_replace("/<\?php(.*?)\?\>|\\$[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/se", "(substr('\\0',0,1)=='\\$')?'<b>\\0</b>':'\\0'", $file);
Avatar billede jensgram Nybegynder
15. januar 2004 - 23:54 #8
Erik > Jeg kan bedre se logikken i din sidste post, så jeg tror jeg vil bruge det forslag (du må gerne ryste på hovedet ;)

Jeg benytter:

$file = preg_replace("/&lt;\?php(.*?)\?&gt;|\\$[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/se", "(substr('\\0', 0, 1) == '\\$' ? '<code style=\"font-weight: bold;\">\\0</code>' : stripslashes('\\0'))", $file);    print $file;

Bemærk: &lt; og &gt;, men jeg kører den _efter_ det vi lavede i går...

Jeg undrer mig over at der skal køres stripslashes() - hvor kommer de slashes fra? Kan du gennemskue det?
Avatar billede jensgram Nybegynder
16. januar 2004 - 12:05 #9
Jeg leget lidt videre, men lukker her.

Tak for hjælpen, Erik.
Avatar billede erikjacobsen Ekspert
16. januar 2004 - 18:20 #10
Det med stripslashes kan jeg ikke se ud fra den linie. Men skal den være ved
den ene \0 skal den vel også ved den anden \0 ?
Avatar billede jensgram Nybegynder
16. januar 2004 - 21:32 #11
Ja, det kan du have ret i ;)

Jeg er dog blevet noget klogere på reg-exp og callback-funktioner på de sidste par dage, så det er jeg da taknemmelig for.
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