Avatar billede sjh Nybegynder
24. februar 2006 - 19:52 Der er 25 kommentarer og
1 løsning

udtræk af data

Hvordan kan jeg lave et "udtræk" med eregi(), preg_match_all() eller hvad der nu kan bruges.. så det ca. virker sådan.

eksempel:
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Sub Test1()
End Sub

Sub Test2(strText As String)
End Sub

Function Test3(strText As String) As String
End Function


så det ca. kommer ud sådan:
Array (
  [0] =>
    Array (
      [0] =>Sub
      [2] =>Sleep
      [3] =>ByVal dwMilliseconds As Long
      [4] =>
    )
  [1] =>
    Array (
      [0] =>Sub
      [2] =>Test1
      [3] =>
      [4] =>
    )
  [2] =>
    Array (
      [0] =>Sub
      [2] =>Test2
      [3] =>strText As String
      [4] =>
    )
  [3] =>
    Array (
      [0] =>Function
      [2] =>Test3
      [3] =>strText As String
      [4] =>As String
    )
)
Avatar billede jakobdo Ekspert
25. februar 2006 - 13:26 #1
Måske noget i stil med:

<?php
//http://www.eksperten.dk/spm/690736

$kode = "Declare Sub Sleep Lib \"kernel32\" (ByVal dwMilliseconds As Long)
Sub Test1()
End Sub

Sub Test2(strText As String)
End Sub

Function Test3(strText As String) As String
End Function";

if(preg_match_all('/^Declare\\s(Sub)\\s(.+?)\\s.+\\((.+?)\\)$/im', $kode, $match))
{
    echo "<pre>";
    print_r($match);
    echo "</pre>";
}

if(preg_match_all('/^(Sub)\\s(.+?)\\((.*?)\\)$/im', $kode, $match, PREG_PATTERN_ORDER))
{
    echo "<pre>";
    print_r($match);
    echo "</pre>";
}

if(preg_match_all('/^(Function)\\s(.+?)\\((.*?)\\)\\s(.+)$/im', $kode, $match, PREG_PATTERN_ORDER))
{
    echo "<pre>";
    print_r($match);
    echo "</pre>";
}

?>
Avatar billede sjh Nybegynder
25. februar 2006 - 15:27 #2
hmm jeg får kun den ene ud :(

Array
(
    [0] => Array
        (
            [0] => Function Test3(strText As String) As String
        )

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

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

    [3] => Array
        (
            [0] => strText As String
        )

    [4] => Array
        (
            [0] => As String
        )

)
Avatar billede jakobdo Ekspert
26. februar 2006 - 15:48 #3
Hvordan har du alt det kode/teekst som skal søges igennem liggende?
Avatar billede sjh Nybegynder
26. februar 2006 - 16:14 #4
hvad mener du?? det er visual basic (vb6) funktioner..
Avatar billede jakobdo Ekspert
26. februar 2006 - 16:35 #5
Ja, men hvordan kommer koden ind i php scriptet?
Avatar billede sjh Nybegynder
26. februar 2006 - 16:41 #6
<?php
  if ($_POST["vbcode"]) {
    $strCode = stripslashes($_POST["vbcode"]);
  }
?>

<form method="post" action="index.php">
  <textarea name="vbcode" rows="20" cols="100"><? echo $strCode; ?></textarea><br>
  <input type="submit" value=" go4 ">
</form>
Avatar billede sjh Nybegynder
26. februar 2006 - 16:43 #7
men jeg tested det bare som du haved lavet det med $kode = "...";
Avatar billede jakobdo Ekspert
26. februar 2006 - 17:10 #8
Prøv at se min kode her: http://www.codebreaker.dk/exp/690736.php
Avatar billede sjh Nybegynder
26. februar 2006 - 17:16 #9
okææ men sådan virker den ikke hos mig.. se: http://vbhansen.dk/690736.php
Avatar billede jakobdo Ekspert
26. februar 2006 - 17:34 #10
Prøv evt i regexp'erne at fjern: ^ og $ i start og slut af dem...
Avatar billede sjh Nybegynder
26. februar 2006 - 17:36 #11
virker :D

smid et svar
Avatar billede jakobdo Ekspert
26. februar 2006 - 17:37 #12
Svar!
Avatar billede sjh Nybegynder
26. februar 2006 - 17:38 #13
men der er lige noget med nummer 2 det ser forkert ud:

Array
(
    [0] => Array
        (
            [0] => Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
            [1] => Sub Test1()
            [2] => Sub Test2(strText As String)
        )

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

    [2] => Array
        (
            [0] => Sleep Lib "kernel32"
            [1] => Test1
            [2] => Test2
        )

    [3] => Array
        (
            [0] => ByVal dwMilliseconds As Long
            [1] =>
            [2] => strText As String
        )

)
Avatar billede jakobdo Ekspert
26. februar 2006 - 17:41 #14
Det er fordi vi nu har fjernet ^ fra starten! :o(
Avatar billede sjh Nybegynder
26. februar 2006 - 19:21 #15
hmm ha ha.. så setter vi da bare den på igen.. nu tror jeg det virker :D
mange tak for hjælpen.. skulle du finde en bedre måde at lave det på så er du velkommen til at komme med koden :d
Avatar billede jakobdo Ekspert
26. februar 2006 - 19:29 #16
Tak for point!
Og ved ikke lige hvordan det skulle laves nemmere.
Det kode som kommer som input, kan jo variere meget, så tror det bliver svært.
Avatar billede sjh Nybegynder
26. februar 2006 - 20:12 #17
Jeg kan se det ikke var så nemt alivel.. men kan du ikke lige se på den igen..

det jeg skal bruge: (opdelt med | er kun for at vise array)
----------------------------------------------------------
Sleep | ByVal dwMilliseconds As Long
SleepNy | ByVal dwMilliseconds As Long
GetProp | ByVal hwnd As Long, ByVal lpString As String | As Long
CreateCompatibleDC | ByVal hdc As Long | As Long
Test1
Test2 | strText As String
Test3 | strText As String | As String
----------------------------------------------------------


"Function" eller "Sub" [OUTPUT1] "("[OUTPUT2]")" [OUTPUT3]

[OUTPUT1] = funktion eller sub navn (vil altid kun indenholde [A-Z0-9_&] stoppes af space)
[OUTPUT2] = options (starter og slutter altid med parentes)
[OUTPUT3] = return vadi (hvis det er en Sub vil der ikke være en return vadi, kun Function kan ha en return vadi)


$kode = "
Declare Sub Sleep Lib \"kernel32\" (ByVal dwMilliseconds As Long)
Declare Sub SleepNy Lib \"kernel32\" Alias \"Sleep\" (ByVal dwMilliseconds As Long)
Declare Function GetProp Lib \"user32\" Alias \"GetPropA\" (ByVal hwnd As Long, ByVal lpString As String) As Long
Declare Function CreateCompatibleDC Lib \"gdi32\" (ByVal hdc As Long) As Long

Sub Test1()
End Sub

Sub Test2(strText As String)
End Sub

Function Test3(strText As String) As String
End Function";

Du skal nok få flere point ;)
Avatar billede jakobdo Ekspert
26. februar 2006 - 20:19 #18
Jeg tror måske du hellere selv skulle prøve at rode lidt! :o)
Prøv at hent et program som hedder REGEXBUDDY
Det er godt til at lave regexp'er med.
Avatar billede sjh Nybegynder
26. februar 2006 - 20:30 #19
virker det tal alle php's -> preg_match_all(), preg_replace(), preg_match(), ereg(), eregi() ??
Avatar billede jakobdo Ekspert
26. februar 2006 - 20:37 #20
Stort set!
Og det skal ikke opfattes som jeg ikke vil hjælpe dig, men det program er altså alle pengede værd. (hvis du jævnligt leger med regexp)
Avatar billede sjh Nybegynder
26. februar 2006 - 21:10 #21
Ja det kan jeg se.. men hvordan fortæller man den at den kun skal vise det som står (.*) og ikke alt det andet + at stoppe ved et mellemrum
Avatar billede jakobdo Ekspert
26. februar 2006 - 21:12 #22
.* er lige med:

. = alle tegn
* = 0 eller flere tegn.
Regexp er grådig, så den tager alle tegn.
Hvis du laver:
(.*?)\s
Vil den tage alle tegn, indtil første mellemrum.
Avatar billede sjh Nybegynder
26. februar 2006 - 21:12 #23
altså : (Function|Sub) (.1) \((.2)\) (.3)

viser så kun
.1
.2
.3
Avatar billede jakobdo Ekspert
26. februar 2006 - 21:15 #24
Hvis vi tager denne streng:
Declare Sub Sleep Lib \"kernel32\" (ByVal dwMilliseconds As Long)
og du skal have fat i Sleep.
så ville jeg lave:
Declare\sSub\s(.*?)\sLib
Så vil Sleep blive fanget i () og du får den ud i et array.
Avatar billede sjh Nybegynder
26. februar 2006 - 21:24 #25
hvordan gør man så hvis noget ikke skal ud.. fx:

Declare\sSub\s(.*?)\sLib(det som står her)\((.*)\)
Avatar billede jakobdo Ekspert
27. februar 2006 - 08:04 #26
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Prøv denne:
Declare\sSub\s(.*?)\sLib\s\"(.*?)\"\s\((.*?)\)
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