/ 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
hjælp til regulært udtryk
Fra : Christian Hansen


Dato : 04-03-02 00:23

Hej

jeg har brug for lidt hjælp til at lave et regulært udtryk. Jeg er ved
at lave et CMS, hvor brugerne bla. kan indsætte nyheder. Hvis de øsnker
at indsætte relaterede links til eksterne sider, vil jeg at de kan gøre
det på formen:

{tekst, som skal klikkes på|url}

ovenstående skal så formateres til

<a href="url">tekst, som skal klikkes på</a>

Der skal ikke være nogen begrænsning på, hvor mange af disse links
brugeren skal kunne indsætte. Jeg har prøvet følgende

ereg("([{].*)([|].*)([}])",$postNews[TEKSTLANG],$match);

Hvor jeg så gerne skulle få et array $match med de forskellige links i.

men det virker ikke, hvis der er flere links end et. Så matcher den
nemlig alt tekst mellem det første { og det sidste }, og så bliver det
noget rod

Er der en, som kan løse ovenstående problem`De rigtigt hårde kan sikkert
klare substitutionen direkte ved en ereg_replace

MVH Christian


 
 
Christian Hansen (04-03-2002)
Kommentar
Fra : Christian Hansen


Dato : 04-03-02 00:58

Nu har jeg bikset lidt videre med det.

følgende virker hvis man kun har indsat et link:

$tekst = "dette er en test {her|http://www.dr.dk/} mon den virker?";
$tekst = preg_replace("|({)(.*)(\|)(.*)(})|","<a
href=\"\\4\">\\2</a>",$tekst);
print $tekst;


Men hvis jeg indsætter et link mere, så går det stadig galt. øv

MVH Christian

Christian Hansen wrote:

> Hej
>
> jeg har brug for lidt hjælp til at lave et regulært udtryk. Jeg er ved
> at lave et CMS, hvor brugerne bla. kan indsætte nyheder. Hvis de øsnker
> at indsætte relaterede links til eksterne sider, vil jeg at de kan gøre
> det på formen:
>
> {tekst, som skal klikkes på|url}
>
> ovenstående skal så formateres til
>
> <a href="url">tekst, som skal klikkes på</a>
>
> Der skal ikke være nogen begrænsning på, hvor mange af disse links
> brugeren skal kunne indsætte. Jeg har prøvet følgende
>
> ereg("([{].*)([|].*)([}])",$postNews[TEKSTLANG],$match);
>
> Hvor jeg så gerne skulle få et array $match med de forskellige links i.
>
> men det virker ikke, hvis der er flere links end et. Så matcher den
> nemlig alt tekst mellem det første { og det sidste }, og så bliver det
> noget rod
>
> Er der en, som kan løse ovenstående problem`De rigtigt hårde kan sikkert
> klare substitutionen direkte ved en ereg_replace
>
> MVH Christian
>



Peter Brodersen (04-03-2002)
Kommentar
Fra : Peter Brodersen


Dato : 04-03-02 00:36

On Mon, 04 Mar 2002 00:57:52 +0100, Christian Hansen
<webmaster@telescopium.dk> wrote:

>$tekst = preg_replace("|({)(.*)(\|)(.*)(})|","<a
>href=\"\\4\">\\2</a>",$tekst);

Din regex er ikke global. Tilføj g som option:

> $tekst = preg_replace("|({)(.*)(\|)(.*)(})|g","<a href=\"\\4\">\\2</a>",$tekst);

--
- Peter Brodersen

Christian Hansen (04-03-2002)
Kommentar
Fra : Christian Hansen


Dato : 04-03-02 11:20

Hej Peter.

Tak for din hjælp. Jeg kunne ikke få den til at fungere med g - den
kender ikke den option, når den placeres, som du har angivet.

Jeg har dog fået mit udtryk til at virke alligevel, se min evt. mit svar
til Andreas.

MVH Christian

Peter Brodersen wrote:

> On Mon, 04 Mar 2002 00:57:52 +0100, Christian Hansen
> <webmaster@telescopium.dk> wrote:
>
>
>>$tekst = preg_replace("|({)(.*)(\|)(.*)(})|","<a
>>href=\"\\4\">\\2</a>",$tekst);
>>
>
> Din regex er ikke global. Tilføj g som option:
>
>
>>$tekst = preg_replace("|({)(.*)(\|)(.*)(})|g","<a href=\"\\4\">\\2</a>",$tekst);
>>
>



Andreas Kleist Svend~ (04-03-2002)
Kommentar
Fra : Andreas Kleist Svend~


Dato : 04-03-02 00:32

On Mon, 04 Mar 2002 00:23:10 +0100
Christian Hansen <webmaster@telescopium.dk> wrote:

> {tekst, som skal klikkes på|url}
>
> ovenstående skal så formateres til
>
> <a href="url">tekst, som skal klikkes på</a>
>
> Der skal ikke være nogen begrænsning på, hvor mange af disse links
> brugeren skal kunne indsætte. Jeg har prøvet følgende
>
> ereg("([{].*)([|].*)([}])",$postNews[TEKSTLANG],$match);

Først og fremmest er der ingen grund til at bruge [ og ] i ovenstående, de
bruges når du vil matche et tegn som er i den gruppe, f.eks. matcher
[abcd] ét af bogstaverne a, b, c eller d, dette kan i øvrigt også opnås
med [a-d]. Hvis man sætter en 'hat' ^ forrest i [] matches alt som ikke er
inde i []'erne. Dvs. [a-d] matcher alt som ikke er a, b, c eller d. Det er
netop det du har brug for, for som du selv har erfaret matcher ereg hele
molevitten fra første { til sidste } i ovenstående, ereg er nemlig grådig
og tager den største streng der matcher.

Derfor er din løsning at fortælle ereg at du vil matche {, et ubestemt
antal tegn som ikke er |, |, et ubestemt antal tegn som ikke er } og }.

Og det ser så sådan her ud:

"{[^\\|]*|[^}]*}"

| skrives som \\| da det i visse ereg-sammenhænge kan betyde eller.

Hvis du så vil lave det hele direkte i ereg_replace skal du markere hvad
det er du helt specifikt vil udvælge, og det gør man med parenteser:

"{([^|]*)|([^}]*)}"

Første udvælgelse er altså det der står mellem { og |, altså din tekst, og
anden udvælgelse er det der står mellem | og }. Man kalder det udvalgte
frem igen i den streng man vil erstatte med vha. "\\1" for den første,
"\\2" for den anden, etc.

Så den streng det skal sættes ind i ser sådan her ud: "<a
href='\\2'>\\1</a>"

Og dit samlede udtryk bliver da:

ereg_replace("{([^|]*)|([^}]*)}", "<a href='\\2'>\\1</a>", $tekststreng);

Det skal i øvrigt nævnes at preg ofte er hurtigere end ereg. (Det er
PHP-manualen der siger 'ofte', jeg har hørt andre sige altid, det er nok
et sted der i mellem.)

--
mvh Andreas Kleist Svendsen

Christian Hansen (04-03-2002)
Kommentar
Fra : Christian Hansen


Dato : 04-03-02 11:19

Hej Andreas.

Mange tak for dit gode svar. Det er rart, når folk, som du, tager sig
tid til at begrunde en løsning. Det lærer man nemlig noget af. Jeg kunne
ikke umiddelbart få din løsning tilat fungere, men fordi du fortalte mig
om, hvorledes ^virker inde i "[]" - altså en slags not, så fik jeg det
alligevel til at virke. Jeg bruger nu følgende udtryk:

$tekst = preg_replace("|({)([^\|]*)(\|)([^\|]*)(})|","<a
href=\"\\4\">\\2</a>",$tekst);

MVH Christian

Andreas Kleist Svendsen wrote:

> On Mon, 04 Mar 2002 00:23:10 +0100
> Christian Hansen <webmaster@telescopium.dk> wrote:
>
>
>>{tekst, som skal klikkes på|url}
>>
>>ovenstående skal så formateres til
>>
>><a href="url">tekst, som skal klikkes på</a>
>>
>>Der skal ikke være nogen begrænsning på, hvor mange af disse links
>>brugeren skal kunne indsætte. Jeg har prøvet følgende
>>
>>ereg("([{].*)([|].*)([}])",$postNews[TEKSTLANG],$match);
>>
>
> Først og fremmest er der ingen grund til at bruge [ og ] i ovenstående, de
> bruges når du vil matche et tegn som er i den gruppe, f.eks. matcher
> [abcd] ét af bogstaverne a, b, c eller d, dette kan i øvrigt også opnås
> med [a-d]. Hvis man sætter en 'hat' ^ forrest i [] matches alt som ikke er
> inde i []'erne. Dvs. [a-d] matcher alt som ikke er a, b, c eller d. Det er
> netop det du har brug for, for som du selv har erfaret matcher ereg hele
> molevitten fra første { til sidste } i ovenstående, ereg er nemlig grådig
> og tager den største streng der matcher.
>
> Derfor er din løsning at fortælle ereg at du vil matche {, et ubestemt
> antal tegn som ikke er |, |, et ubestemt antal tegn som ikke er } og }.
>
> Og det ser så sådan her ud:
>
> "{[^\\|]*|[^}]*}"
>
> | skrives som \\| da det i visse ereg-sammenhænge kan betyde eller.
>
> Hvis du så vil lave det hele direkte i ereg_replace skal du markere hvad
> det er du helt specifikt vil udvælge, og det gør man med parenteser:
>
> "{([^|]*)|([^}]*)}"
>
> Første udvælgelse er altså det der står mellem { og |, altså din tekst, og
> anden udvælgelse er det der står mellem | og }. Man kalder det udvalgte
> frem igen i den streng man vil erstatte med vha. "\\1" for den første,
> "\\2" for den anden, etc.
>
> Så den streng det skal sættes ind i ser sådan her ud: "<a
> href='\\2'>\\1</a>"
>
> Og dit samlede udtryk bliver da:
>
> ereg_replace("{([^|]*)|([^}]*)}", "<a href='\\2'>\\1</a>", $tekststreng);
>
> Det skal i øvrigt nævnes at preg ofte er hurtigere end ereg. (Det er
> PHP-manualen der siger 'ofte', jeg har hørt andre sige altid, det er nok
> et sted der i mellem.)
>
>



Søg
Reklame
Statistik
Spørgsmål : 177560
Tips : 31968
Nyheder : 719565
Indlæg : 6408941
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste