Avatar billede t-rex Nybegynder
13. august 2009 - 12:08 Der er 4 kommentarer og
1 løsning

Tjekke en tekst efter punktum PHP

Hey eksperter

Jeg sidder med en lille opgave hvor jeg har nogle elever som skal sætte punktummer i en tekst hvor efter jeg så skal tjekke om de har sat dem de rigtig steder… har ledt efter noget som kan hjælpe mig i php til at tjekke om punktummerne er sat de rigtig steder men kan ikke finde noget… så håber der er en der ud der kan hjælpe.


Teksten som elever ser:


Manden så ud til at være omkring de halvtreds og drengen et sted mellem fire og fem de havde
sat sig på en ledig bænk på perron 2 var alle seks bænke i øvrigt ledige der var meget stille på
den lille station lige nu drengen stod stille og betragtede et par duer der spankulerede rundt om
hinanden og sig selv havde han bare haft sin slangebøsse med tænkte drengen manden fortsatte
med begge ben satte drengen pludselig af han havde fået øje på en tokrone manden kiggede på
sit ur der var ti minutter til det næste tog vi mon de rigtige billetter med tænkte manden i det
samme lød det over højttaleren: gå ikke over sporet



Den rigtig tekst hvor / er et punktum:


Manden så ud til at være omkring de halvtreds og drengen et sted mellem fire og fem / de havde
sat sig på en ledig bænk / på perron 2 var alle seks bænke i øvrigt ledige / der var meget stille
på den lille station lige nu / drengen stod stille og betragtede et par duer der spankulerede rundt
om hinanden og sig selv / havde han bare haft sin slangebøsse med tænkte drengen / manden
fortsatte / med begge ben satte drengen pludselig af / han havde fået øje på en tokrone / manden
kiggede på sit ur / der var ti minutter til det næste / tog vi mon de rigtige billetter med tænkte
manden / i det samme lød det over højttaleren: gå ikke over sporet /

Hilsen

Ronni
Avatar billede repox Seniormester
13. august 2009 - 23:38 #1
Nedenstående giver dig to arrays at sammenligne med der hver især angiver positionerne for punktummer/skråstregerne.

Så skal du bare sammenligne dem efter den metode du mener er mest rigtig.

<?php



function strallpos($haystack,$needle,$offset = 0){
    $result = array();
    for($i = $offset; $i<strlen($haystack); $i++){
        $pos = strpos($haystack,$needle,$i);
        if($pos !== FALSE){
            $offset =  $pos;
            if($offset >= $i){
                $i = $offset;
                $result[] = $offset;
            }
        }
    }
    return $result;
}

$test = <<< EOT
Manden så ud til at være omkring de halvtreds og drengen et sted mellem fire og fem de havde
sat sig på en ledig bænk på perron 2 var alle seks bænke i øvrigt ledige der var meget stille på
den lille station lige nu drengen stod stille og betragtede et par duer der spankulerede rundt om
hinanden og sig selv havde han bare haft sin slangebøsse med tænkte drengen manden fortsatte
med begge ben satte drengen pludselig af han havde fået øje på en tokrone manden kiggede på
sit ur der var ti minutter til det næste tog vi mon de rigtige billetter med tænkte manden i det
samme lød det over højttaleren: gå ikke over sporet
EOT;

$kontrol = <<< EOT
Manden så ud til at være omkring de halvtreds og drengen et sted mellem fire og fem / de havde
sat sig på en ledig bænk / på perron 2 var alle seks bænke i øvrigt ledige / der var meget stille
på den lille station lige nu / drengen stod stille og betragtede et par duer der spankulerede rundt
om hinanden og sig selv / havde han bare haft sin slangebøsse med tænkte drengen / manden
fortsatte / med begge ben satte drengen pludselig af / han havde fået øje på en tokrone / manden
kiggede på sit ur / der var ti minutter til det næste / tog vi mon de rigtige billetter med tænkte
manden / i det samme lød det over højttaleren: gå ikke over sporet /
EOT;


$testData = strallpos($test, ".");
$kontrolData = strallpos($kontrol, "/");


?>
Avatar billede _skou_ Nybegynder
14. august 2009 - 00:33 #2
Her er et udkast.
Det tager ikke højde for hvis brugeren tilføjer mere end et punktum i træk. F.eks.: "abc .. def". Eller hvis der tilføjes et punktum midt i et ord, eller hvis der tilføjes, rettes eller slettes i teksten.

<?php
function strposa($haystack ,$needles=array(),$offset=0){
    $chr = array();
    foreach($needles as $needle){
        $chr[] = strpos($haystack,$needle,$offset);
    }
    if(empty($chr)) return false;
    return min($chr);
}

$correctText =
"Manden så ud til at være omkring de halvtreds og drengen et sted mellem fire og fem.
de havde sat sig på en ledig bænk.
på perron 2 var alle seks bænke i øvrigt ledige.
der var meget stille på den lille station lige nu.
drengen stod stille og betragtede et par duer der spankulerede rundt om hinanden og sig selv.
havde han bare haft sin slangebøsse med tænkte drengen.
manden fortsatte.
med begge ben satte drengen pludselig af.
han havde fået øje på en tokrone.
manden kiggede på sit ur.
der var ti minutter til det næste.
tog vi mon de rigtige billetter med tænkte manden.
i det samme lød det over højttaleren: gå ikke over sporet.";

$enteredText = "Manden så ud til at være omkring de halvtreds. og drengen et sted mellem fire og fem. de havde
sat sig på en ledig bænk på perron 2. var alle seks bænke i øvrigt ledige . der var meget stille
på den lille station lige nu . drengen stod stille og betragtede et par duer. der spankulerede rundt
om hinanden og sig selv  havde han bare haft sin slangebøsse. med tænkte drengen . manden
fortsatte med begge ben. satte drengen pludselig af . han havde fået øje på en tokrone . manden
kiggede på sit ur der var ti minutter til det næste tog. vi mon de rigtige billetter med tænkte
manden . i det samme lød det over højttaleren: gå ikke over sporet.";

// ------------------------------------------------------

// Fjern forekomster af mellemrum i træk.
$correctText = ereg_replace("[[:space:]]+", " ", $correctText);
// Fjern mellemrum omkring punktum.
$correctText = ereg_replace("[[:space:]]*\.[[:space:]]*", ".", $correctText);
// Fjern alt der ikke er punktum og mellemrum.
$correctPunctation = ereg_replace("[^. ]+", "", $correctText);

// $correctPunctation er nu en unik tekst streng som angiver den korrekte måde punktummer skal stå på.

//echo "\"".$correctText."\"\n";
//echo "\"".$correctPunctation."\"\n";

// Tilføj et ekstra mellemrum til sidst. Tager højde for situationer hvor brugeren ikke har sat punktum til sidst.
$enteredText .= " ";

// Samme fremgang som med $correctText.
$enteredText = ereg_replace("[[:space:]]+", " ", $enteredText);
$enteredText = ereg_replace("[[:space:]]*\.[[:space:]]*", ".", $enteredText);

$enteredPunctation = ereg_replace("[^. ]+", "", $enteredText);

// $enteredPunctation er brugerens indtastede punkt sætning.

//echo "\"".$enteredText."\"\n";
//echo "\"".$enteredPunctation."\"\n";

if ($correctPunctation == $enteredPunctation) {
  echo "Punktummer er placeret korrekt.\n";
}
else {
  echo "Punktummer er IKKE placeret korrekt.\n";
 
  // Lav en rettet udgave.
  $correctedText = str_replace(".", " ", $correctText);
 
  $offset = 0;
  $offsetCount = -1;
 
  // Løkke over punkt sætningen.
  for ($i = 0, $j = 0, $k = 0; $i < strlen($enteredPunctation); $i++, $offsetCount++) {
    // Find positionen af næste punktum eller mellemrum.
    $offset = strposa($correctText, array(".", " "), ($offset == 0 ? 0 : $offset+1));
    if ($offset === false) $offset = strlen($correctText)-1;
   
    // Hvis de to tegn ikke er ens er der fejl!
    if ($enteredPunctation[$i] != $correctPunctation[$i]) {
      // Insæt "\ /" (manglende punktum) eller "\./" (forkert punktum) omkring fejlen.
      $correctedText = substr_replace($correctedText, " \\".$enteredPunctation[$i]."/ ", $offset+4*$j+$k, 1);
      $j++;
    }
    else if ($enteredPunctation[$i] == ".") {
      // Tilføj korrekt satte punktummer til den rettede tekst.
      $correctedText = substr_replace($correctedText, ". ", $offset+4*$j+$k, 1);
      $k++;
    }
  }
 
  echo "\"".$correctedText."\"\n";
}

?>
Avatar billede t-rex Nybegynder
14. august 2009 - 09:27 #3
Tak for løsningen begge to... nice kode du har lavet der _skou_
smider du ikke et svar det var lige det jeg skulle bruge takke mange gange for det...
Avatar billede _skou_ Nybegynder
14. august 2009 - 11:14 #4
oOoOOoOo
Avatar billede t-rex Nybegynder
14. august 2009 - 14:26 #5
hey _skou_ kan du ikke kigge en tur forbi http://www.eksperten.dk/spm/883628
Det kan være du også kan hjælpe mig med dette problem :)
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
Kurser inden for grundlæggende programmering

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