Avatar billede jds Nybegynder
19. april 2008 - 04:27 Der er 15 kommentarer og
1 løsning

Finde slut parentes til tilhørende start parentes

Hej


Jeg skal bruge et script der kan finde slutparentesen til en startparentes.

Jeg har en string, og vil finde en start parentes med den tilhørende slutparentes.

Eks.:

$somestring = "Bla bla bla bla bla fed( bla bla ( bla ) bla ( bla bla) bla bla bla)";


jeg ønsker altså at hente den tekst der er inde i parentesen der starter ved "fed("  og slutter det rigtige sted.


Håber min forklaring er til at forstå..

/JDS
Avatar billede olebole Juniormester
19. april 2008 - 12:29 #1
<ole>

Hvad mener du med, du skal finde den? Hvad er det helt præcist, du skal lave?

/mvh
</bole>
Avatar billede jds Nybegynder
19. april 2008 - 17:48 #2
Altså jeg skal lave noget PHP der bedre kan vise matematik i HTML.

så når jeg skriver (352)over(34+sqrt(3))

så skal mit php script gå ind og finde hvad der er i de forskellige parenteser således at det kan blive skrevet op pænt i HTML:

352/(34+v(3))

Hvis du forstår..

Derfor skal jeg bruge noget der kan finde udtrykkene mellem de rigtige parenteser..
Avatar billede g1mzee Nybegynder
19. april 2008 - 18:22 #3
jeg er ikke sikker.
men du kan jo prøve og undersøge det, men der er vidst noget med at reg.epx kan tage det sidste, og første. det vil vidst kunne løse det. jeg er ikke lige nogen ekspert inde for det område. men mon der ikke er andre der er ? ;D
Avatar billede olebole Juniormester
19. april 2008 - 18:33 #4
Det er vist en større parser, du skal have skrevet. Parenteser kan jo optræde på alle mulige måder - nestede og ikke. Det bliver meget hurtig en kompleks størrelse  =)
Avatar billede bauerdata Nybegynder
19. april 2008 - 19:01 #5
En større parser findes allerede.
Den hedder python

def over(val1, val2):
  return val1 / val2

def sqrt( val ):
    return pow( val, 0.5)

input = "(352)over(34+sqrt(3))"
eval ( input )
Avatar billede bauerdata Nybegynder
19. april 2008 - 19:03 #6
Obs duer ikke kom til at trykke send for tidligt :-/
Avatar billede bauerdata Nybegynder
19. april 2008 - 19:30 #7
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
kommandoer={\
    "over":"/"
}


def sqrt( val ):
    return pow( val, 0.5 )

def run( query ):
    for kmd, operator in kommandoer.items():
        query = query.replace( kmd, operator )
    # print query
    return eval( query )

if __name__ == "__main__":
    input = "(352)over(34+sqrt(3))"
    print run( input )

Output:
9.85109984019
Avatar billede olebole Juniormester
19. april 2008 - 20:56 #8
Jeg tror, du misforstår, hvad brugeren er ude i. Såvidt jeg har forstået, er det en del af GDLib-ting, der skal outputte et billede med noget matematik. Det er således ikke selve resultatet, der er interessant:
    http://www.eksperten.dk/spm/827858
Avatar billede jds Nybegynder
19. april 2008 - 21:04 #9
Det er nemlig korrekt, jeg ønsker ikke resultatet. Men ønsker PHP til at udskrive eks. nedenstående HTML når jeg skriver (342) over (455).


<table border="0" width="41">
    <tr>
        <td width="35" style="border-bottom-width:1; border-bottom-color:black; border-bottom-style:solid;">
            <p align="center">342</p>
        </td>
    </tr>
    <tr>
        <td width="35">
            <p align="center">455</p>
        </td>
    </tr>
</table>
Avatar billede olebole Juniormester
19. april 2008 - 21:18 #10
- og det bedste er, at når du er færdig, kan du sikkert tjerne en pæn skilling på scriptet. Der er en ikke ringe efterspørgsel på den slags, men et yderst ringe udbud ... det er absolut ikke ukompliceret at lave  ;o)
Avatar billede nielle Nybegynder
20. april 2008 - 08:16 #11
Den nemmeste måde er vel at gennemløbe strengen tegn for tegn - venstre til højre et tegn af gangen. Så har du en tæller som tæller antallet af parenteser op:

if ($detteTegn == "(") {
    $parentesNiveau++;
} else if ($detteTegn == ")") {
    $parentesNiveau--;
}

Når du er nået til den '('-parentes det drejer sig om notere du værdien af $parentesNiveau. Derefter tæller du vidre indtil $parentesNiveau igen har den samme værdi. Den ')'-parentes du så står ved er den som matcher.

Bemærk at dette kun vil fungere hvis parenteserne faltisk er balancerede.
Avatar billede bauerdata Nybegynder
20. april 2008 - 15:49 #13
Vil du købe programmet olebole. (ps det er gratis og gpl)
Avatar billede nielle Nybegynder
13. maj 2008 - 22:39 #14
jds?
Avatar billede jds Nybegynder
14. maj 2008 - 00:57 #15
Hej, beklager mit fravær det sidste stykke tid.

Jeg har nu fundet en løsning der fungerer. Jeg ved ikke om det kan gøres hurtigere... men den bygger på tælle-parenteser-princippet som nielle fremlagde.

Jeg bruger STRPOS() til at finde min første parentes, herefter en WHILE løkke og SUBSTR() til at finde den tilhørende slutparentes ved at lave en tællevariabel (=1) der tæller modsatrettede parenteser ned og ensrettede parenteser op. Hermed er slutparentesen fundet når tælleren i løkken bliver 0 - Da jeg da på det givne tidspunkt har fundet en lige mange ensrettede og modsatrettede parenteser.

Jeg skal nok få lagt et eksempel op snart hvis nogen vil prøve det af!

Men jeg synes lige du, nielle, skal have credits for dit hint!

Lukker..

JDS
Avatar billede nielle Nybegynder
14. maj 2008 - 17:26 #16
Svar :^)
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

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