/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
Reg.exp
Fra : Thomas Lindgaard


Dato : 17-04-02 10:41

Davs

Jeg er ved at lave et site, hvor sproget let skal kunne ændres, og al tekst
ligger derfor i filer (en for hver side). Teksterne ligger i følgende
format:

<id="en tekst">
blablabla
</id>
<id="noget html">
her kan der stå HTML og en masse specialtegn og danske tegn og alt
muligt
</id>

Disse tekster vil jeg have lagt over i et assoc. array, således at "en
tekst" peger på "blablabla" osv.

array("en tekst" => "blablabla", "noget html" => "...");

Filerne kan parses med preg_match_all, og jeg har noget grim kode som gør
det... men er der en derude som kan skrive et reg.exp. der matcher efter
følgende opskrift:

1) <id="
2) noget tekst
3) ">
4) noget som _ikke_ er </id>
5) </id>

Mit problem er 4) - hvordan definerer jeg at noget ikke må være strengen
"</id>"? ([^</id>]* dur ikke - heller ikke når specialtegn escapes eller der
tilføjes gåseøjne).

Mvh. Thomas



 
 
Søren Nielsen (17-04-2002)
Kommentar
Fra : Søren Nielsen


Dato : 17-04-02 11:11

Thomas Lindgaard wrote:

> 1) <id="
> 2) noget tekst
> 3) ">
> 4) noget som _ikke_ er </id>
> 5) </id>
> Mit problem er 4) - hvordan definerer jeg at noget ikke må være
strengen
> "</id>"? ([^</id>]* dur ikke - heller ikke når specialtegn escapes
eller der
> tilføjes gåseøjne).

Fra 3) skal dit regulære udtryk være lidt i denne stil
>(.*?)</id>

? gør at den ikke er "grådig" dvs. stopper når den finder '</id>'.
Det er muligvis nødvendigt at escape '/': '\/' alt afhængig af hvad du
bruger som afgrænser i dit udtryk.

--
Med venlig hilsen
Søren Nielsen
news@n-crypt.dk




Thomas Lindgaard (17-04-2002)
Kommentar
Fra : Thomas Lindgaard


Dato : 17-04-02 13:54

Davs

> Fra 3) skal dit regulære udtryk være lidt i denne stil
> >(.*?)</id>

Det er desværre ikke nok... punktum matcher ikke newlines. Jeg prøvede så
med ([.\n]*?), men det virker heller ikke. Eksemplet herunder kan ikke
matches vha. koden nederst:

$lang_buffer = "
<id=\"PARAGRAPH_welcome\">
<h1>Overskrift</h1>
hej
</id>
";

$pattern = "/ <id=\" (\w+) ([.\n]*) <\/id> / xU";
$matches = array();
preg_match_all($pattern, $lang_buffer, $matches);

x og U i slutningen af $pattern gør at der matches ungreedy og at whitespace
i $pattern ignoreres.

Mvh. Thomas




Søren Nielsen (17-04-2002)
Kommentar
Fra : Søren Nielsen


Dato : 17-04-02 11:14

"Thomas Lindgaard" <thomas@it-snedkeren.dk> wrote in message
news:3cbd43d7$0$97305$edfadb0f@dspool01.news.tele.dk...
> Mit problem er 4) - hvordan definerer jeg at noget ikke må være
strengen
> "</id>"? ([^</id>]* dur ikke - heller ikke når specialtegn escapes
eller der
> tilføjes gåseøjne).

Naturligvis fungerer det ikke at bruge [^</id>]*, da det har en helt
anden betydning.
Det betyder jo at du vil finde alle tegn som ikke er i mængden
{<,/,i,d,>} og siger således ikke noget om rækkefølgen af tegnene.


--
Med venlig hilsen
Søren Nielsen
news@n-crypt.dk



Nezar Nielsen (17-04-2002)
Kommentar
Fra : Nezar Nielsen


Dato : 17-04-02 15:52

"Thomas Lindgaard" <thomas@it-snedkeren.dk> skrev i en meddelelse
news:3cbd43d7$0$97305$edfadb0f@dspool01.news.tele.dk...

> Filerne kan parses med preg_match_all, og jeg har noget grim kode som gør
> det... men er der en derude som kan skrive et reg.exp. der matcher efter
> følgende opskrift:
>
> 1) <id="
> 2) noget tekst
> 3) ">
> 4) noget som _ikke_ er </id>
> 5) </id>

preg_match_all('/<id="(.*?)">(.*?)<\/id>/s',$lang_buffer,$matches);

Fra perldoc perlre(i mangel på bedre):

s Treat string as single line. That is, change "." to
match any character whatsoever, even a newline, which
it normally would not match.


> Mit problem er 4) - hvordan definerer jeg at noget ikke må være strengen
> "</id>"? ([^</id>]* dur ikke - heller ikke når specialtegn escapes eller
der
> tilføjes gåseøjne).

Som du vidst selv er inde på senere i denne tråd: non greedy matching (".*?"
i stedet for bare ".*", det giver den mindste match muligt..)


--
Mvh. Nezar Nielsen,

Nano - Advanced Simplicity
http://www.nano.dk



Thomas Lindgaard (17-04-2002)
Kommentar
Fra : Thomas Lindgaard


Dato : 17-04-02 21:13

Davs

> preg_match_all('/<id="(.*?)">(.*?)<\/id>/s',$lang_buffer,$matches);
>
> Fra perldoc perlre(i mangel på bedre):
>
> s Treat string as single line. That is, change "." to
> match any character whatsoever, even a newline, which
> it normally would not match.

Du er min ven :)

Her kommer lige et før-efter-billede, så du kan se, hvad du har reddet mig
fra:
før: "/ <id=\" (\w+) \"> ([\w\n\t\r\d
æøåÆØÅé;:\.,%\<\>\/'\(\)\?\"\-\*!\$=\&\#+]*) <\/id> / xU";
efter: "/ <id=\" (\w+) \"> (.*) <\/id> / xsU";

/Thomas



Søg
Reklame
Statistik
Spørgsmål : 177504
Tips : 31968
Nyheder : 719565
Indlæg : 6408549
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste