Avatar billede donslund Nybegynder
12. oktober 2004 - 14:59 Der er 14 kommentarer og
1 løsning

Opdele tekst i et array

Jeg er ude efter et lille stykker kode der kan print de ord der er brugt i en tekst og samtidig fortælle mig hvor mange gange et ord er brugt. Jeg vil bruge split $pieces = split("[,. :]+!&-",$tekst); og så på en måde lave et 2 dimensionelt array til at samle det op i.
Avatar billede jakoba Nybegynder
12. oktober 2004 - 15:13 #1
Det er din regular expression der er gal.
jeg tipper du ønsker at opdele på alle de tegn der står i strengen.

$pieces = split("[\[,. :\]+!&-]",$tekst);

tegnene '[' og ']' er specialtegn for regular expressions. for at bruge dem som almindelige bogstaver skal de escapes.

I den expression jeg skriver oven for benyttes de også i deres regexp-betydning: "vi omkranser en sekvens af tegn og hvert af de tegn kan bruges som match her"

mvh JakobA
Avatar billede donslund Nybegynder
12. oktober 2004 - 15:16 #2
Men den splitter ikke på mellemrum.
Planen er, at den skal alfabetisere ordenen.

Min kode er:

<?
if(isset($tekst)){
$pieces = split("[\[,. :\]+!&-]",$tekst);
sort($pieces);
    for ($i=0; $i<=count($pieces)-1; $i++) {
        @$ny_tekst = $ny_tekst.$pieces[$i]." ";
       
    }
}

?>
Indsæt din tekst i boksen.
<form action="opdel.php" method="post" name="Opdel"><textarea wrap="on" rows="10" cols="30" name="tekst"><? print @$ny_tekst; ?></textarea><br><input type="submit" value="Opdel" name="Opdel"></form><br><br>
Avatar billede jakoba Nybegynder
12. oktober 2004 - 15:21 #3
Ups, den var også gal. Den der split brugen en bastard form af regular expressions hvor man ikke kan stole på '\'

$pieces = split("[][,. :+!&-]",$tekst);

nogen gange hader jeg php :(
Avatar billede jakoba Nybegynder
12. oktober 2004 - 15:32 #4
PS: jeg synes du sagde do ønskede at tælle hvor mange gange de forskellige ord står i strengen.
Avatar billede bojo Nybegynder
12. oktober 2004 - 16:56 #5
mon noget af dette kan bruges til noget, jeg lærte da lidt af at lave det :-)

<?
$tekst = <<<EOD
Jeg er ude efter et lille stykker kode der kan print de ord der er brugt i en tekst og samtidig fortælle mig hvor mange gange et ord er brugt. Jeg vil bruge split $pieces = split("[,. :]+!&-",$tekst); og så på en måde lave et 2 dimensionelt array til at samle det op i.
EOD;

$ord_cnt = str_word_count( $tekst );
$ord_arr = str_word_count($tekst, 1);

// antal ord
echo "Total: $ord_cnt ord<p />";

//alle ordene
foreach($ord_arr as $v) {
    echo "$v<br />";
    $ord[$v]+=1;
}

//brugt hvor meget
foreach($ord as $k => $v) {
    echo "$k - $v gang<br />";
}
?>
Avatar billede bojo Nybegynder
12. oktober 2004 - 17:13 #6
hov, lagde ikke mærke til alfabetisere. Her en udvidet udgave

<?
$tekst = <<<EOD
Jeg er ude efter et lille stykker kode der kan print de ord der er brugt i en tekst og samtidig fortælle mig hvor mange gange et ord er brugt. Jeg vil bruge split $pieces = split("[,. :]+!&-",$tekst); og så på en måde lave et 2 dimensionelt array til at samle det op i.
EOD;

$ord_cnt = str_word_count( $tekst );
$ord_arr = str_word_count($tekst, 1);

// antal ord
echo "Total: $ord_cnt ord<p />";

//alle ordene
echo "<p /><b>Alle ordene som de stod</b><br />";
foreach($ord_arr as $v) {
    echo "$v<br />";
    $ord[$v]+=1;
}

//alle ordene
asort($ord_arr);
echo "<p /><b>Alle ordene sorteret</b><br />";
foreach($ord_arr as $v) {
    echo "$v<br />";
    $ord[$v]+=1;
}


//brugt hvor meget
echo "<p /><b>Brug som de stod</b><br />";
foreach($ord as $k => $v) {
    echo "$k - $v gang<br />";
}

ksort($ord);
//brugt hvor meget sorteret på ord
echo "<p /><b>Brug sorteret på ord</b><br />";
foreach($ord as $k => $v) {
    echo "$k - $v gang<br />";
}

asort($ord);
//brugt hvor meget sorteret på antal
echo "<p /><b>Brug sorteret på antal</b><br />";
foreach($ord as $k => $v) {
    echo "$k - $v gang<br />";
}
?>
Avatar billede donslund Nybegynder
13. oktober 2004 - 08:45 #7
Det ser godt ud, men den laver altså noget mystisk. For det første, så sorterer den ikke helt efter bogen og så skærer den nogle ord over.
Avatar billede donslund Nybegynder
13. oktober 2004 - 08:47 #8
Giver i øvrigt også problemer på serveren. Ikke lokalt.

http://www.kongeborgen.dk/hit_stuff/opdel.php
Avatar billede bojo Nybegynder
13. oktober 2004 - 08:59 #9
hvilken PHP version køre du?

str_word_count er med fra (PHP 4 >= 4.3.0)

At den bider over fatter jeg ikke lige, hverken asort eller ksort har warnings om noget som helst, læs mere om dem her http://dk2.php.net/manual/da/function.asort.php men hvis den gør det skal du måske bruge http://dk2.php.net/manual/da/function.usort.php istedet, medens du læser om det :-) kigger jeg på en str_word_count der virker på ældre PHP
Avatar billede bojo Nybegynder
13. oktober 2004 - 10:42 #10
Jeg håber dette kan løse problemet med str_word_count. Sort klipper ikke ord over hos mig så det kan jeg ikke lige klare.
<?
//findes funktionen str_word_count

if (!function_exists('str_word_count')) {
    //næææ - så vi laver den selv samt en funktion til at fjerne tomme elementer, jeg ved ikke hvorfor den er nødvendig
    function empty_a( $t ) { if( $t != "" ) return $t; else return; }
    function str_word_count( $t, $cnt=0 ) {
        $m = preg_split("/[\s()\"=\[\];,.:+!&-\/{}\$0123456789]/U",$t);
        $m = array_filter($m, "empty_a");
        if( $cnt==0 ) {
            // tæl antallet af ord
            $rc = count( $m );
        } else {
            // returner arrayet
            $rc = $m;
        }
        return $rc;
    }
   
}

$tekst = <<<EOD
Jeg er ude efter et lille stykker kode der kan print de ord der er brugt i en tekst og samtidig fortælle mig hvor mange gange et ord er brugt. Jeg vil bruge split \$pieces = split("[,. :]+!&-",\$tekst); og så på en måde lave et 2 dimensionelt array til at samle det op i.
EOD;

$ord_cnt = str_word_count( $tekst );
$ord_arr = str_word_count($tekst, 1);

// antal ord
echo "Total: $ord_cnt ord<p />";

//alle ordene
echo "<p /><b>Alle ordene som de stod</b><br />";
foreach($ord_arr as $v) {
    echo "$v<br />";
    $ord[$v]+=1;
}

//alle ordene
asort($ord_arr);
echo "<p /><b>Alle ordene sorteret</b><br />";
foreach($ord_arr as $v) {
    echo "$v<br />";
}

//brugt hvor meget
echo "<p /><b>Brug som de stod</b><br />";
foreach($ord as $k => $v) {
    echo "$k - $v gang<br />";
}

ksort($ord);
//brugt hvor meget sorteret på ord
echo "<p /><b>Brug sorteret på ord</b><br />";
foreach($ord as $k => $v) {
    echo "$k - $v gang<br />";
}

asort($ord);
//brugt hvor meget sorteret på antal
echo "<p /><b>Brug sorteret på antal</b><br />";
foreach($ord as $k => $v) {
    echo "$k - $v gang<br />";
}

?>
Avatar billede bojo Nybegynder
13. oktober 2004 - 10:51 #11
pyy - en "bøf", denne regexp er meget pænere og gør vist det samme

        $m = preg_split("/[^\w]|[0-9]/U",$t);
Avatar billede donslund Nybegynder
13. oktober 2004 - 15:16 #12
Prøv lige at se her: http://www.kongeborgen.dk/hit_stuff/opdel.php
Er der grænser for hvor mange tegn $tekst må indeholde?
Avatar billede bojo Nybegynder
13. oktober 2004 - 19:32 #13
Ja det er da ikke godt, ikke mindst fordi æøåÆØÅ ikke regnes med som bogstaver og det skaber jo lidt "ged" i det.

hos dig bliver sommergæster til

sommerg
ster

så der er mindst en ting der skal rettes i den regexp

Så vidt jeg har kunnet læse mig til er der ingen begrænsninger ved hvor mange tegn den kan tage. Jeg har lige provet med samme indput hos os begge, nemlig dit 1. ønske

----------------------------------------
Jeg er ude efter et lille stykker kode der kan print de ord der er brugt i en tekst og samtidig fortælle mig hvor mange gange et ord er brugt. Jeg vil bruge split $pieces = split("[,. :]+!&-",$tekst); og så på en måde lave et 2 dimensionelt array til at samle det op i.
-----------------------------------------

du har 4 ord mere end jeg og det er lige det antal æøå du har: fortælle, så, på og måde

jeg kigger på det men har jo lidt svært ved at teste det :-(

prøv at ændre til

$m = preg_split("/[\s\(\"\[\]:+!&-=]|[0-9]/U",$t);
Avatar billede donslund Nybegynder
01. november 2004 - 09:08 #14
Smid et svar så jeg kan lukke.
Jeg er ikke rigtig kommet videre.
Avatar billede donslund Nybegynder
23. december 2004 - 10:14 #15
Hm. Så lukker jeg bare.
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