[PHP] RegEx lookahead probleem

Pagina: 1
Acties:
  • 104 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • 4Real
  • Registratie: Juni 2001
  • Laatst online: 14-09-2024
Ik heb het volgende probleem ik wil met regex delen uit een string halen (door middel van preg_match_all) en die later gaan bewerken, nu ben ik een aardig eind opweg gekomen maar zit vast op stuk dat het RegEx deel vooruit moet kijken.

PHP:
1
2
3
4
5
$str = 'begin-text <br />
    {message.id?}bericht content{;}<br />
    {if.statement?}if=true{:}if=false (else){;}<br />eind text';

preg_match_all("/{([^}]*)\?}([^{]*?)(?!{:}([^}]*)){;}/ise", $output, $regs, PREG_SET_ORDER);

Als ik de output bekijk van $regs staat dit er in
code:
1
2
3
4
5
6
7
8
9
10
Array
(
    [0] => Array
        (
            [0] => {message.id?}bericht content{;}
            [1] => message.id
            [2] => bericht content
        )

)

Maar er staat niks in over de 2e if statement in de string, dat ik ook het deel waar die vast loopt de eerst is namelijk een IF zonder else en die andere zit wel een ELSE in maar daar kijkt die.. niet over slaat die over.

Acties:
  • 0 Henk 'm!

  • 4Real
  • Registratie: Juni 2001
  • Laatst online: 14-09-2024
klein kickje :P maar ook stukje code omdat ik niet stil blijf zitten :)

ik heb nu geprobeert om eerst uit een sting verschillende delen te halen de volgende oplossing werkt wel maar geeft geen nette oplossing

PHP:
1
2
3
4
5
6
7
    $str = 'test1 {:} test2';

    preg_match_all("/([^{:}]*)(?!{:}(.+?))/ise", $str, $regs, PREG_SET_ORDER);
    
    echo "<pre>";
    print_r($regs);
    echo "</pre>";

en dan is dit het resultaat
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
Array
(
    [0] => Array
        (
            [0] => text
            [1] => text
        )

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

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

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

    [4] => Array
        (
            [0] =>  test2
            [1] =>  test2
        )

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

)


en als ik de string
PHP:
1
$str = 'text test2';

gebruik dan krijg ik dit

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Array
(
    [0] => Array
        (
            [0] => text test2
            [1] => text test2
        )

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

)


hij geeft veels teveel lege array's weer hoe kan dit :? en ik heb geprobeert om simpel deze 2 expressie's samentevoegen maar dat wil ook niet :?

Acties:
  • 0 Henk 'm!

  • PierreAronnax
  • Registratie: Maart 2002
  • Niet online
De tekens { en } hebben binnen een regular expression hun eigen betekenis. Als je wilt gebruiken om naar te zoeken moet je ze escapen.
In jou geval moet je dus \{ en \} gebruiken. Het zelfde geldt trouwens voor meerdere tekens in je regex.

Lees anders de manual nog eens door.

Pierre - Motormedia.nl - Motor-Forum.nl - Motorshopper.nl - Motormeuk.nl - Motorstek.nl


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

{ en } hebben alleen speciale betekenis als je ze als delimiter gebruikt

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • 4Real
  • Registratie: Juni 2001
  • Laatst online: 14-09-2024
ok volgende stap hij komt nu aardig in de buurt van hoe ik hem wil hebben alleen nog 1 raar iets wat me scheef zit.

me RegEx:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/
\{      # match een accolade
 ([^}]*)    # gevolgd door alles tot een sluit accolade
 \?     # gevolgd door een vraageten
\}      # gevolgd door een sluit accolade
(.+?)       # gevolgd door zo min mogelijk "iets"
(           # gevolgd door mogelijk ...
 \{     # ... een accolade
:       # een dubbele punt
\}      # een sluit accolade
(.+?)       # gevolgd door zo min mogelijk "iets"
)?
\{      # gevolgd door een accolade
;       # gevolgd door punt-komma
\}      # en als afsluiter een sluit accolade
/


Wat als output geeft bij de volgende string
PHP:
1
$str = 'begin text {var.param?}text1{:}text2{;} andere text {var.param2?}text{;}';


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Array
(
    [0] => Array
        (
            [0] => {var.param?}text1{:}text2{;}
            [1] => var.param
            [2] => text1
            [3] => {:}text2
            [4] => text2
        )

    [1] => Array
        (
            [0] => {var.param2?}text{;}
            [1] => var.param2
            [2] => text
        )
)

zowel met en zonder {:} (else) doet die het, maar bij de string gedeelte waar {:} instaal geeft die in de array op het volgende aan [3] => {:}text2 die mag er van mij part wel uit is dit nog mogelijk of hoort dit zo?

Acties:
  • 0 Henk 'm!

  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023
4Real schreef op zondag 30 januari 2005 @ 18:05:
[...]die mag er van mij part wel uit is dit nog mogelijk of hoort dit zo?
Dat kan met non-capturing parenthesis: (?:...) ipv (...).

Acties:
  • 0 Henk 'm!

  • 4Real
  • Registratie: Juni 2001
  • Laatst online: 14-09-2024
Dank u allen ik ben er uit _/-\o_

dit is het uiteindelijk geworden
PHP:
1
$regex = '/\{([^}]*)\?\}(.+?)(?:\{:\}(.+?))?\{;\}/';


Van mij part mag er een slotop en in achief er met! :Y)
Pagina: 1