Avatar billede labisama Nybegynder
24. oktober 2012 - 21:56 Der er 8 kommentarer og
1 løsning

Udskift tegn med mysql-udtræk

Hej med jer

Jeg vil høre om følgende er muligt, eller hvordan I ville lave det.

Ideen er at have to tabeller hhv. "Dokumenter" og "Tekster".

I et af dokumenter indeholder:

"Dette er noget tekst bla. bla... osv...
[text:1]
Noget mere tekst..."

Her kunne jeg godt tænke mig en funktion/opbygning i hvordan [text:1] kan udskiftes med id = 1 fra tabellen "tekster".

Jeg har kigget lidt på str_replace, men umiddelbart er det jo "bare" en streng den udskifter med en anden. Jeg vil helst gerne undgå at indlæse alle tekster fra "Tekster"-tabellen.

Håber det var forståeligt, og en der kan give mig et godt hint til at få det løst.
Avatar billede labisama Nybegynder
24. oktober 2012 - 21:59 #1
Jeg mangler måske lige at have forklaret at [text:1] så bliver udskiftes med indholdet fra tekster med id=1. Dette kunne fx. være:

"Tekst inde fra test sdgdsgsd og kan blive rettet og opdateret i tabellen..."

Dermed bliver dokumentets tekst så:

"Dette er noget tekst bla. bla... osv...
Tekst inde fra test sdgdsgsd og kan blive rettet og opdateret i tabellen...
Noget mere tekst..."
Avatar billede olebole Juniormester
24. oktober 2012 - 22:14 #2
<ole>

Det er strtr, du skal have fat i.

"men umiddelbart er det jo "bare" en streng den udskifter med en anden. Jeg vil helst gerne undgå at indlæse alle tekster fra "Tekster"-tabellen." >> Så må du først finde alle de forskellige [text:n] i dokumentstrengen og hente de tilsvarende rækker i databasen. Derefter bygger du dit array til strtr, hvorefter du kører funktionen på dokumentstrengen

/mvh
</bole>
Avatar billede labisama Nybegynder
26. oktober 2012 - 18:49 #3
Tak for dit svar, Ole.

Det giver rigtig god mening (nu).

Kan du forklare hvad forskellen ligger i str_replace og strtr? Synes funktionerne minder meget om hinanden.
Avatar billede olebole Juniormester
26. oktober 2012 - 20:28 #4
str_replace er en generel søg/erstat funktion, som kan mange forskellige ting.

strtr er en decideret oversætter funktion (strtr = string_translate). Den kan i modsætning til str_replace modtage en streng og ét associativt array. Det associative array gør ofte funktionen lettere at arbejde med:

Den bruges f.eks. også tit, når tegn skal skiftes til smiley-billeder:

$aReplace(
    ':)' => '<img src="smile.png">',
    ':(' => '<img src="frown.png">',
    ':,|' => '<img src="cry.png">'
);
$newString = strtr($sString, $aReplace);

Med str_replace skal du have to arrays. Ét til strengene/tegnene, der skal søges efter - og ét til erstatningerne. Det er ofte mere bøvlet at arbejde med
Avatar billede labisama Nybegynder
26. oktober 2012 - 23:05 #5
Tak for en god forklaring.

Ang. at finde og udtrække fx. [Text:1] i en lang streng/tekst. Hvilken funktion ville du anbefale til dette formål?

Du må godt skrive det som et svar :)
Avatar billede olebole Juniormester
27. oktober 2012 - 00:14 #6
Hvis du tester denne kode, vil du se, at tallene ligger i $matches[1]:

$text = 'Lorem ipsum dolor sit amet, [text:1] consectetur adipiscing elit. Aliquam vel dui velit [text:2]. Aliquam dictum, nibh blandit commodo [text:3] volutpat, augue diam ornare ligula [text:2], ac pharetra tortor lacus sed purus. Fusce [text:4] ullamcorper, dolor in molestie [text:1] ornare, felis ante luctus erat, et porttitor [text:5] augue dolor viverra dui.';

preg_match_all('/\[text:(\d+)\]/', $text, $matches);

var_dump($matches);

Som du kan se, har jeg brugt nogle tekster flere gange, hvilket naturligvis afspejles i array'et af tal. Hvis du lige før, du dumper array'et til browseren, indsætter linjen:

$matches = array_unique($matches[1]);

- fjernes gengangere, og $matches overskrives med $matches[1], så array'et nu kun indeholder tallene.

Jeg har ikke helt styr på, hvad du præcist laver, men mon ikke 'Lorem ipsum' teksten fra eksemplet skal hentes langt oftere, end det skal gemmes? I så fald ville det nok være smartest at gemme tallene i et ekstra felt, når teksten gemmes. Så parser du kun teksten én gang - i stedet for hvergang den hentes/læses.

I virkeligheden ville jeg nok gøre noget helt tredie  =)

Jeg ville have 'Lorem ipsum' teksten i én tabel, knyttet sammen med en id, txt_id. Indsætningsteksterne ville jeg lægge i en anden tabel med en id repl_id. En tredie tabel skulle så indeholde to felter txt_id og repl_id.

Når en 'Lorem ipsum' tekst uploades - evt. sammen med nogle tekster til udskiftning/indsættelse - oprettes samtidig en række i tabellen med de to ID'er for hver [text:n], der måtte være i teksten. Tallet n kunne passende være udskiftningstekstens txt_id i DB'en.

Når du har hentet 'Lorem ipsum' teksten, vil du så kunne lave en joined SELECT mod tabellen med de to ID'er og tabellen med udskiftningstekster - og hente dem i ét hug. Derved ville du udnytte MySQL som relational DB. Men så er vi vist henne i noget lidt andet. Du kan jo tænke lidt over det - søge lidt - og/eller åbne en ny tråd, hvis der opstår specifikke spørgsmål  *o)

Ellers tak, jeg samler ikke point. Læg selv et svar og accepter det, så tråden lukkes  =)
Avatar billede olebole Juniormester
27. oktober 2012 - 00:19 #7
Ups, det var vist meningsforstyrrende:

"Når en 'Lorem ipsum' tekst uploades - evt. sammen med nogle tekster til udskiftning/indsættelse - oprettes samtidig en række i tabellen med de to ID'er for hver [text:n], der måtte være i teksten. Tallet n kunne passende være udskiftningstekstens repl_id i DB'en."  =)
Avatar billede labisama Nybegynder
28. oktober 2012 - 22:03 #8
Tusind tak for hjælpen og dine gode inputs.

Jeg prøver at lege videre med funktionerne og de nye indspark du har givet.
Avatar billede olebole Juniormester
28. oktober 2012 - 23:25 #9
Selvtak  =)
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