Avatar billede thomaxz Nybegynder
19. november 2007 - 14:49 Der er 18 kommentarer og
1 løsning

Regular exprestions

Jeg har flg. tekst

=logo=
{menu}
{nyheder}
#bund#

det jeg gerne vil udtræke er

=logo=

men hvis der stod ==logo eller =logo== eller andre kombination af lighedstengs skal den ikke matche

der skal kun stå alt indne f.eks istedet for logo kun der står hans, banner, img etc.

jeg har prøvet lidt.
og er nået frem til

={1}[^=]*={1}

som desvære også matcher =logo==

men hvis jeg kommer ^ og $ på

^={1}[^=]*={1}$

matcher den ikke =logo= :S
Avatar billede pidgeot Nybegynder
19. november 2007 - 14:56 #1
Hvad med:
[^=]=[^=]*=[^=]
Avatar billede pidgeot Nybegynder
19. november 2007 - 14:57 #2
Rettelse:

[^=]=[^=]+=[^=]

...et eller andet skal der vel stå derinde, så vi skal have + i stedet for *
Avatar billede coderdk Praktikant
19. november 2007 - 15:03 #3
/(^|[^=])=([a-z]+)=([^=]|$)/im for logo f.eks.?
Avatar billede thomaxz Nybegynder
19. november 2007 - 15:04 #4
næ kan ikke få den til det med dem,
Avatar billede thomaxz Nybegynder
19. november 2007 - 15:09 #5
det jeg vil er at hvis jeg

=logo=
{menu}
=nyheder=
#bund#

så retunere den

=logo=
=nyheder=

hvis jeg har

=logo=
{menu}
=nyheder==
#bund#

retunere den kun =logo=
Avatar billede coderdk Praktikant
19. november 2007 - 15:13 #6
Det virker fint for mig:

$tekst = "=logo=
{menu}
=nyheder==
#bund#";
echo preg_replace("/(^|[^=])=([a-z]+)=([^=]|$)/im", "<h1>\\2</h1>", $tekst );

Her skriver den <h1>logo</h1> og resten bliver ikke rørt...
Avatar billede nielle Nybegynder
19. november 2007 - 15:13 #7
Sådan?

(?<=[^=]=)([^=]+)(?==[^=])

Det er i hvert fald noget lookaround du skal have fat på:

http://www.regular-expressions.info/lookaround.html
Avatar billede coderdk Praktikant
19. november 2007 - 15:19 #8
Ja, det kan også gøres med lookahead og lookbehind som nielle skriver, så er det:

/(?<=)=([a-z]+)=(?!=)/im

Det gør det samme som den jeg skrev ovenfor, bortset fra at "<h1>\\2</h1>" så skal være "<h1>\\1</h1>" da lookahead/-behind ikke tæller som grupper...
Avatar billede smitten1 Nybegynder
19. november 2007 - 15:23 #9
det står ikke tilfældigvis på hver sin linie?
Avatar billede thomaxz Nybegynder
19. november 2007 - 17:41 #10
Kommentar: coderdk 19/11-2007 15:13:15 >

Det virker ikke hos mig, nu er meningen ogås at viser der både =logo= og =nyheder= skal den udksifte begge 2 , men med forskeligt indhold.

Kommentar: nielle 19/11-2007 15:13:49 >

Den giver fejl ved eregi


Warning: eregi() [function.eregi]: REG_BADRPT in G:\wamp\www\handys\regex\reg.php on line 6

og ved preg_match_all

Warning: preg_match_all() [function.preg-match-all]: Unknown modifier '(' in G:\wamp\www\handys\regex\reg.php on line 5


Kommentar: coderdk 19/11-2007 15:19:20 >

får tomme reulstater med /(?<=)=([a-z]+)=(?!=)/im med preg_match_all og fejl ved eregi.

Kommentar: smitten1 19/11-2007 15:23:43 >

som regle jo.




det jeg vil er blot at først utrække allt =tilfældig tekst=

så jeg kan behandle dem, jeg aner intet om hvor man =tag= der er.
Avatar billede nielle Nybegynder
19. november 2007 - 17:53 #11
> Den giver fejl ved eregi

Du bør heller ikke bruge de oldgamle ereg-funktioner. De forsvinder snart helt fra PHP. Desuden er preg-funktionerne hurtiger og tilbyder langt flere muligheder (som f.eks. den viste model). :^)

> og ved preg_match_all

Svært at forholde sig til fejlen uden at have set din kode.
Avatar billede coderdk Praktikant
19. november 2007 - 17:55 #12
echo preg_replace("/(^|[^=])=([^=]+)=([^=]|$)/im", "<h1>\\2</h1>", $tekst );

og

echo preg_replace("/(?<=)=([^=]+)=(?!=)/i", "<h1>\\1</h1>", $tekst );

virker fint hos mig - Den erstatter alle "tags" som =hej= og =tilfældig tekst= men f.eks. ikke ==hej= eller =test==
Avatar billede coderdk Praktikant
19. november 2007 - 17:56 #13
(og hvorfor bruge preg_match_all når du kan bruge replace? du skal vel bare erstatte dem med noget? Måske skal du bruge preg_replace og /e switchen, hvis du ikke direkte bare kan bruge preg_replace
Avatar billede thomaxz Nybegynder
19. november 2007 - 18:43 #14
nille ->

preg_match_all($exp,$txt,$match);

hvor $exp kommer fra en form og inholder regular expressionen

har også prøvet manuelt indkodet med samme fejl.

noget jeg heller ikke kan forså er at

burde .* ikke matche alt?

hmm. kan se at (.*) at macther lidt specielt?

Array
(
    [0] => Array
        (
            [0] => =logo=
            [1] =>
            [2] => {menu}
            [3] =>
            [4] => =nyheder=
            [5] =>
            [6] => #bund#
            [7] =>
            [8] =>
        )

)

:s
Avatar billede nielle Nybegynder
19. november 2007 - 18:49 #15
Husk at preg-versiuonerne skal have formen:

"/.../modifiers"

Du skal derfor nok gøre det sådan her i din ovenstående kode:

preg_match_all("/$exp/m",$txt,$match);
Avatar billede thomaxz Nybegynder
19. november 2007 - 19:15 #16
ja, det fnadt jeg ud af,


fandt ud af coders

/(^|[^=])=([^=]+)=([^=]|$)/im ser ud til at virke

den gir flg. resultat

Array
(
    [0] => Array
        (
            [0] => =logo=
            [1] =>
=nyheder=
        )

    [1] => Array
        (
            [0] =>
            [1] =>

        )

    [2] => Array
        (
            [0] => logo
            [1] => nyheder
        )

    [3] => Array
        (
            [0] =>
            [1] =>
        )

)



=logo=
{menu}
=nyheder=
#bund#

og flg. resultat

Array
(
    [0] => Array
        (
            [0] =>
=nyheder=
        )

    [1] => Array
        (
            [0] =>

        )

    [2] => Array
        (
            [0] => nyheder
        )

    [3] => Array
        (
            [0] =>
        )

)

er der nogen måder at komme af me mellerumene? og evt. fjer dem uden = tegn?

og skulle der var en mulighed at få en forklaring for fatter hat af den perl syntax.
Avatar billede coderdk Praktikant
19. november 2007 - 21:04 #17
Komme af med mellemrummene og ferne dem uden =?

Bare brug $array[2] og ingen af de andre? ;P

Men igen: Hvad vil du opnå og hvorfor bruge preg_match_all i stedet for preg_replace? :)
Avatar billede thomaxz Nybegynder
20. november 2007 - 14:18 #18
kam man være sikker påat de altid liger sig i 2'ern? men gik bare igenem arrayet og laved et nyt med dem jeg skulle bruge, men kan stadig ikke hitte ud af din regular expression:

/(^|[^=])=([^=]+)=([^=]|$)/i
Avatar billede coderdk Praktikant
20. november 2007 - 15:49 #19
Ja, de ligger altid i 2'eren.

(^|[^=]) betyder starten af en linje eller et tegn der ikke er =
=([^=]+)= betyder = efterfulgt af mindst ét tegn der ikke er = efterfulgt af =
([^=]|$) betyder et tegn der ikke er = eller slutningen af en linje
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