Avatar billede mbw Nybegynder
22. juni 2008 - 11:49 Der er 18 kommentarer og
1 løsning

Parsing af text.

Jeg står og skal bruge et script som kan parse noget text.
Teksten kommer noget lignende.

Spg:
Svar


Spg:


Spg:
Svar
Spg:
Svar

Skal have fjernet alle tomme linjer og Spg: hvor der ikke er noget svar under. Der er aldig ":" i slutningen af et svar.

Nogen RegEx eksperter som har mulighed for at hjælpe. Er desværre helt tabt her.
Avatar billede w13 Novice
22. juni 2008 - 12:07 #1
Kan du ikke bare replace dobbeltlinjeskift (\n\n) og "Spg:\n" med et enkelt?
Avatar billede mbw Nybegynder
22. juni 2008 - 12:14 #2
Replace dobbellinjeskift løser selvfølgelig det ene problem.

Men Spg: er ikke fast. Kan være
Kan jeg:
Ja

Kunne jeg:


Og ville gerne have det parset så jeg fx kan formatere og skrive <h1>Spg<h1><p>Svar</p>

Eller indsætte i database eller hvad der nu engang bliver optimalt.
Kunne selvfølgelig have været mere grundig i min forklaring når jeg kigger nu.
Avatar billede jakobdo Ekspert
22. juni 2008 - 12:19 #3
Men er der ikke tekst efter Spg: og Svar ?
Eller er det kun som du har der ?
For ville det så ikke være som W13 skriver.
Først slette alle tomme linjer.
Så kan du efterfølgende lave en replace på Spg: med: <h1>Spg:</h1> og bagefter replace Svar med <p>Svar</p>
Avatar billede kjeldsted Novice
22. juni 2008 - 12:20 #4
Så det eneste man kan gå ud fra er at der er et ":" efter et spørgsmål og en ny linje efter et svar?
Avatar billede mbw Nybegynder
22. juni 2008 - 12:23 #5
Ja. Det er nogenlunde det.
Avatar billede jakobdo Ekspert
22. juni 2008 - 12:33 #6
Kunne du ikke prøve at fylde lidt mere data på din tekst ?
Det må vel være noget i stil med:

Spg: Hvad hedder kongen af eksperten.dk ?
Svar Han hedder ikke noget, men prøv med Dronning Gurli.

Eller er det kun Spg: og Svar der står ?
Avatar billede mbw Nybegynder
22. juni 2008 - 12:45 #7
Tror jeg er træt. Kan godt selv se jeg ikke er tydelig.
Der står slet ikke spg eller svar...


Der står noget tekst. Er der ":" efter er det et spørgsmål er der ikke et ":" efter er det er svar. Det er altid en linie tekst.
Avatar billede jakobdo Ekspert
22. juni 2008 - 12:56 #8
Test denne kode:
<?php
$text = 'DIN TEKST';
$parts = explode("\r\n",$text);
for($i = 0; $i < count($parts); $i++){
    if(!empty($parts[$i])){
        if(preg_match('/^(.*?:)$/', $parts[$i])){
            echo '<h1>' . $parts[$i] . '</h1>';
        }else{
            echo '<p>' . $parts[$i] . '</p>';
        }
    }
}
?>
Avatar billede mbw Nybegynder
22. juni 2008 - 13:36 #9
Det fungerer super. Med undtagelse af at den ikke fjerner spgs uden svar. Det er ikke essentielt. Men kunne være fantastisk.
Avatar billede jakobdo Ekspert
22. juni 2008 - 13:54 #10
Skal den fjerne spørgsmål uden svar også ?
Avatar billede jakobdo Ekspert
22. juni 2008 - 13:54 #11
Ahh, det står der jo netop også i starten! :o)
Avatar billede mbw Nybegynder
22. juni 2008 - 13:56 #12
Når jeg ikke formulerer mig ordentligt kan jeg jo heller ikke forvente folk læser grundigt :)
Avatar billede jakobdo Ekspert
22. juni 2008 - 14:02 #13
Hvor kommer disse data fra ?
Avatar billede mbw Nybegynder
22. juni 2008 - 14:12 #14
Det er en helvedes masse data, som skal copy/pastes ind i en database, og som ikke er særlig velformateret. Man kan selv sidde og slette de ting som mangler, men det her kan spare en masse tid.

Det ville faktisk være optimalt med en selvstændig funktion til at slette linjer som slutter på ":" og som enten har \n eller en anden linje med ":" tilsidst efter sig.

Så kan jeg blot slette overskydende tekst ved indsætning og bruge den fremragende funktion du har lavet til at formatere ved udtræk.
Avatar billede mbw Nybegynder
22. juni 2008 - 14:13 #15
*slette de ting som er overskydende. Det andet giver jo ikke mening.
Avatar billede mbw Nybegynder
22. juni 2008 - 14:56 #16
Det var jo egentlig super simpelt med din funktion.

  $text = $_POST["text"];
  $parts = explode("\r\n",$text);
  for($i = 0; $i < count($parts); $i++){
    if(!empty($parts[$i])){
      if(preg_match('/^(.*?:)$/', $parts[$i])){
        if(!preg_match('/^(.*?:)$/', $parts[$i+1])){
          echo '<h1>' . $parts[$i] . '</h1>';
        }
      }else{
        echo '<p>' . $parts[$i] . '</p>';
      }
    }
  }

Med mindre det kan gørew nemmere så smid et svar så får du point. Det var fatastisk :)
Avatar billede mbw Nybegynder
22. juni 2008 - 15:00 #17
Og så lige en sidste if på så den ikke går ud af arrayet med $i+1

$text = $_POST["text"];
$parts = explode("\r\n",$text);
for($i = 0; $i < count($parts); $i++){
    if(!empty($parts[$i])){
        if(preg_match('/^(.*?:)$/', $parts[$i])){
            if(count($parts)>($i+1)){
                if(!preg_match('/^(.*?:)$/', $parts[$i+1])){
                    echo '<h1>' . $parts[$i] . '</h1>';
                }
            }
        }else{
            echo '<p>' . $parts[$i] . '</p>';
        }
    }
}
Avatar billede jakobdo Ekspert
22. juni 2008 - 17:12 #18
Du får et svar!
Avatar billede jakobdo Ekspert
22. juni 2008 - 21:07 #19
Takker for point.
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