Avatar billede supermand69 Nybegynder
09. september 2006 - 12:41 Der er 13 kommentarer og
1 løsning

oversætte hele ord

hej

jeg skal have oversat hele ord

eks.
'remix' => 'mix'
'aremix' => 'aremix'
'a remix' => 'a mix'
'(a remix)' => '(a mix)'
Avatar billede nielle Nybegynder
09. september 2006 - 18:29 #1
I PHP:

$tekst = preg_replace("#\bremix\b#i", "mix", $tekst);

Ved at sætte \b ind i et mønster, matcher den kun ved enden af et ord.
Avatar billede supermand69 Nybegynder
10. september 2006 - 11:16 #2
hvad gør # så?
Avatar billede nielle Nybegynder
10. september 2006 - 11:38 #3
#-tegnet er ikke en del af selve det regulære udtryk, men er derimod en del af syntaksen i preg_X() funktionerne. Tit ser man andre tegn brugt:

$tekst = preg_replace("/\bremix\b/i", "mix", $tekst);

- men jeg foretrækker egentlig #-tegnet. Der er dog (næsten) frit valg.

Det regulære udtryk er:

\bremix\b

- altså dit ord, med en \b i hver ende. \b matcher "enden af ordet", og \bremix\b betyder altså at der skal matches på "starten af ordet", dernæst remix, dernæst "slutningen af ordet". Det er altså \b som gør at der matches på hele ord.

Resten er som sagt preg_X() syntaks:

$tekst = preg_replace("#...#i", "mix", $tekst);

- og #-tegnet bruges til at afgrænse det regulære udtryk og adskille det fra det lille "i" som er med til at gøre at den viste løsning er case-insentiv.

Syntaksen er arvet fra perl i sin tid.
Avatar billede supermand69 Nybegynder
10. september 2006 - 12:00 #4
tak for den fine beskrivelse :)

jeg har dog lige en ting mere, som egentlig burde være et nyt spørgsmål

jeg skal have lavet første bogstav stort

eks
'd-nox' => 'D-Nox'
'marc o'tool' => 'Marc O'Tool'
osv
Avatar billede supermand69 Nybegynder
10. september 2006 - 12:00 #5
lav lige et svar også :)
Avatar billede nielle Nybegynder
10. september 2006 - 12:08 #6
Det kan du gøre ved simpelthen at angive det der skal replaces med med stort:

$tekst = preg_replace("#\bremix\b#i", "Mix", $tekst);
$tekst = preg_replace("#\bd-nox\b#i", "D-Nox", $tekst);
$tekst = preg_replace("#\bmarc o'tool\b#i", "Marc O'Tool", $tekst);

... og et svar :^)
Avatar billede supermand69 Nybegynder
10. september 2006 - 12:26 #7
er ikke lige med på den sidste der? :)

altså det behøver jo ikke lige være de navne jeg har indtastet.. det kunne være hvilke som helst andre :)
Avatar billede nielle Nybegynder
10. september 2006 - 12:37 #8
Har du ikke en liste af ord som skal oversættes med andre ord?

remix => Remix
'd-nox' => 'D-Nox'
'marc o'tool' => 'Marc O'Tool'
Avatar billede supermand69 Nybegynder
10. september 2006 - 12:50 #9
jo, men som jeg sagde.. det her burde måske være oprettet i et nyt spørgsmål.. det var bare hvis du lige hurtigt kunne svare mig

$trans_arr = array(
    '#\bvs\b#i' => 'vs.',
    '#\bversus\b#i' => 'vs.',
    '#\bfeat\b#i' => 'feat.',
    '#\bfeaturing\b#i' => 'feat.',
    '#\bft\b#i' => 'feat.',
    '#\band\b#i' => '&',
    '#\bdj\b#i' => 'DJ',
    '#\bmix\b#i' => 'mix',
    '#\bremix\b#i' => 'mix',
    '#\brmx\b#i' => 'mix'
);
$artist = preg_replace(array_keys($trans_arr), array_values($trans_arr), $artist);

men det her er i en anden reg. exp. :)
Avatar billede supermand69 Nybegynder
10. september 2006 - 12:51 #10
pt har jeg den her, men den tager f.eks. ikke 'D-Nox' eller 'Marc O'Tool'

$mix = implode(' ', array_map('ucfirst', explode(' ', $mix)));
Avatar billede nielle Nybegynder
10. september 2006 - 13:03 #11
Denne her burde kunne klare det hele i et hug.

$tekst = preg_replace("#\b(\w)#ie", "strtoupper('\\1')", $tekst);
Avatar billede supermand69 Nybegynder
10. september 2006 - 13:06 #12
gider du forklare hvad den gør? :)
Avatar billede nielle Nybegynder
10. september 2006 - 13:33 #13
Jeg skal forsøge:

Med "e" tilføjet efter # vil preg_replace("#..."#e", ..., ...) lave et såkaldt callback, dvs. at den kalder den funktion som står på plads nr. 2:

"strtoupper('\\1')"

Den kalder altså strtoupper(), men du kunne også have haft ucfirst() i stedet. Der bliver altså kaldt en funktion som konvertere "noget" til stort.

Hvad er dette "noget" så for noget?

Det regulære udtryk ser sådan her ud:

\b(\w)

Her matcher \b som sagt "starten af et ord".

Derefter kommer (\w). \w matcher "a-zA-Z0-9_" dvs. "et bogstav, et tal eller _" (med en setlocale - se http://www.eksperten.dk/spm/731459 - vil den også matche æ, ø, og å).

(...) - parenteserne betyder blot at det der er matchet skal huskes til senere. Det bliver husket som \\1 - 1 fordi at det er den første parentes (og den eneste) i det regulære udtryk. Men \\1 er jo netop det som vi puttede ind i kaldet til strtoupper() ovenfor.

Altså:

1) Det regulære udtryk:

\b(\w)

- matcher "starten af et ord", efterfulgt af "et bogstav, et tal eller en understreg".

1b) Det er selvfølgelig kun bogstaverne vi er interesseret i, men de andre tegn bliver alligevel ikke påvirket af strtoupper().

2) Det bogstav der er i starten af ordet, bliver husket under navnet \\1.

3) Via det lille e (som står for "evaluate") bliver der lavet et callback til strtoupper('\\1').

Resultat:

Alle bogstaver som står i starten af et ord bliver konverteret til stort bogstav.
Avatar billede supermand69 Nybegynder
10. september 2006 - 14:04 #14
igen mange tak for en god beskrivelse :)

rart at vide hvad det er man laver i stedet for bare at copy/paste det hele ind
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