Avatar billede h_thunbo Nybegynder
20. juni 2007 - 00:03 Der er 17 kommentarer og
1 løsning

tilfældig stykke tekst af stor tekst

Hej eksperter!

Jeg mangler en kode som kan hive en stump tekst ud af en stor tekst.  Det hele er i SQL db. Fx så den henter tekst fra et punktum til et andet.
Den skal starte/stoppe tekststrengen ved . ! ?
men ikke " & ( ) - ,

Så hvis man har flere artikler i db, kan man på forsiden se en sætning fra en eller anden artikel.
Er den for svær?
Avatar billede zurekk Nybegynder
20. juni 2007 - 01:16 #1
Jeg ved ikke om der findes en lettere måde, men du kunne gøre sådan her:

$string = explode( '.', $dinartikel );
echo $string[0] . '.';

Så skriver den alle ud, INDEN det første punktum, og tilføjer et punktum.
Men prøv.
Avatar billede jakobdo Ekspert
20. juni 2007 - 15:38 #2
En metode som er meget brugt, er at tage starten af teksten, f.eks. med:
substr($LANG_TEKST,0,20);
Det vil vise de første 20 tegn.
Avatar billede h_thunbo Nybegynder
20. juni 2007 - 18:02 #3
Hmm...
jakobdo -> Jeg kan ikke bruge din metode, da de første 20 tegn jo kan være en halv sætning og det skal være en hel.

zurekk -> Det var en måde at gøre det på. Men hvad så der hvor en sætning ender med ! eller ? ?

Og hvis det er alle den udskriver er det heller ikke så godt. Det skal bare være en tilfældig, eller tre.

Jeg har tænkt lidt på om man kunne lave det så jeg laver et nyt dokument og tilføjer til dokumentet, hver gang man gemmer en artikel. Det nye dokument, som enten kunne være i db eller .txt kunne så indeholde præcis den samme artikel, og alle de andre artikler, men med et linjeskift for hver punktum og så kan man bare kalde tilfældige linjer?
Avatar billede jakobdo Ekspert
20. juni 2007 - 21:17 #4
Men hvad er kendetegnet for en sætning?
Er det noget som ender på: .!? og hvad hvis sætningen slet ikke har en sådan?
Avatar billede jakobdo Ekspert
20. juni 2007 - 21:25 #5
Hvis vi siger en sætning ender på .!?, så prøve denne kode:

if(preg_match_all('/\b(.+?)(\.|\?|\!)/', $dinArtikel, $result))
{
    $count = count($result[0]);
    $rand = rand(0,($count-1));
    echo $result[0][$rand];
}
Avatar billede h_thunbo Nybegynder
21. juni 2007 - 01:41 #6
Jeg kender ikke koden, men jeg tror jeg kan se hvor du vil hen med den og det er måske også den rigtige vej. Den virker bare ikke... Der sker ikke noget. Hvad kan der være galt?

<html>
<head>
</head>
<body>
<?
<!-- forbindelse til MySQL db -->

if(preg_match_all('/\b(.+?)(\.|\?|\!)/', $tekst, $result))
{
    $count = count($result[0]);
    $rand = rand(0,($count-1));
    echo "$result[0][$rand]";
}
?>
</body>
</html>
Avatar billede jakobdo Ekspert
21. juni 2007 - 07:28 #7
Husker du at smide noget tekst i $tekst?

Du kan evt. teste med:

$tekst = 'Sætning nummer 1. Sætning nummer 2! Sætning nummer 3?';

Det skal indsættes over if(preg....
Avatar billede h_thunbo Nybegynder
21. juni 2007 - 08:49 #8
Nu er vi vist tæt på.
Jeg har:
<html>
<head>
</head>
<?
$tekst = 'Sætning nummer 1. Sætning nummer 2! Sætning nummer 3?';
if(preg_match_all('/\b(.+?)(\.|\?|\!)/', $tekst, $result))
{
    $count = count($result[0]);
    $rand = rand(0,($count-1));
    echo "$result[0][$rand]";
}
?>
</body>
</html>

Men det den smidder ud er "array[0]", "array[1]" eller "array[2]". Jeg er ikke den skarpeste til arrays, så hvordan får jeg lavet det om til at den skriver "sætning nummer 1" osv?
Nu har jeg jo min $tekst i SQL db, men der er mange $tekster. Kan jeg på en måde sige $tekst = $tekst1 + $tekst2 + $tekst3... ?
Avatar billede jakobdo Ekspert
21. juni 2007 - 08:55 #9
Din ECHO skal være:
echo $result[0][$rand];
og ikke:
echo "$result[0][$rand]";
Avatar billede h_thunbo Nybegynder
21. juni 2007 - 09:50 #10
yes... Det fungere... Hvordan er det så jeg samler alle tekster i en $tekst fra min database?
Det blir mega godt det her!
Avatar billede h_thunbo Nybegynder
21. juni 2007 - 09:54 #11
ah... Det fungere!

Jeg har bare et problem når de selv har trykket linjeskift?
Hvordan kan jeg gøre så det ikke betyder ny sætning?
Avatar billede jakobdo Ekspert
21. juni 2007 - 10:06 #12
Tilføj et s i denne linie:
if(preg_match_all('/\b(.+?)(\.|\?|\!)/', $tekst, $result))
så det bliver:
if(preg_match_all('/\b(.+?)(\.|\?|\!)/s', $tekst, $result))
Avatar billede h_thunbo Nybegynder
21. juni 2007 - 12:25 #13
Det virker. Men den tager kun eksempler fra en tekst. Ikke fra alle... er der en logisk forklaring på det?
Kan det hjælpe hvis jeg siger alle tekster har fået tildelt et nummer som i $id ?
Avatar billede jakobdo Ekspert
21. juni 2007 - 12:51 #14
Men jeg forstår ikke hvad ud mener med alle tekster?

Hvis du har dem i en database/tabel, så kunne du:

$tekst = '';
$query = mysql_query("SELECT tekst FROM tekster");
while($row = mysql_fetch_assoc($query))
{
$tekst .= $row['tekst'];
}

//Her kommer koden så du har fra mit tidligere indlæg.
Avatar billede jakobdo Ekspert
21. juni 2007 - 12:52 #15
Dog vil det være en dum måde at lave det på.
Så ville jeg hellere lave:

$query = mysql_query("SELECT tekst FROM tekster ORDER BY rand() LIMIT 1");
while($row = mysql_fetch_assoc($query))
{
    if(preg_match_all('/\b(.+?)(\.|\?|\!)/s', $row['tekst'], $result))
    {
        $count = count($result[0]);
        $rand = rand(0,($count-1));
        echo $result[0][$rand];
    }
}
Avatar billede h_thunbo Nybegynder
21. juni 2007 - 15:15 #16
Det er perfekt!

Det er jeg godt nok glad for!

Mange tak for hjælpen!
Sender du et svar?
Avatar billede jakobdo Ekspert
21. juni 2007 - 15:19 #17
Svar!
Avatar billede jakobdo Ekspert
22. juni 2007 - 08:28 #18
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