webForumDet fria alternativet

Plocka ut långa och korta ord med regexp

PHP

4 svar · 560 visningar · startad av Ankman

Medlem sedan juni 2002116 inlägg
Frågan#1

Jag vill ta bort ord som är kortare än tre tecken eller längre än 20 tecken från en sträng. Så här långt har jag kommit:

$text = preg_replace('/(\s[\w]{1,2}\s)|(\s[\w]{20,}\s)i/', ' ', $text);

Problemet kommer när orden innehåller åäö, då funkar det inte. Jag har även provat att byta ut bokstavsklassen(heter det så?) mot [a-z0-9åäö] men resultatet blir det samma.
Någon som är bra på detta?

(Om man använder [php]-taggen så tas alla "\" bort från texten, märkligt)

Medlem sedan aug. 20002 975 inlägg
#2

Kör setlocale() tidigare i skriptet. Någon av följande kombinationer brukar fungera:

setlocale(LC_ALL, 'sv_SE');
setlocale(LC_ALL, 'swedish');
setlocale(LC_ALL, 'sv_SE.ISO8859-1');

Då ska du nog få med åäö att ingå i \w.

Medlem sedan juni 2002116 inlägg
#3

Det fungerar utsökt, åäö kommer med nu (jag använde den första varianten). Dock får jag det fortfarande inte att fungera som jag vill. Alla korta ord rensas bort men inte långa. Jag har ändrat lite:

$text = preg_replace('/(\b[\w]{1,2}\b)|(\b[\w]{20,}\b)i/', ' ', $text);

Är detta förresten rätt sätt att använda \b på? Det verkar i alla fall fungera som jag vill.

Medlem sedan aug. 20002 975 inlägg
#4

Testa så här:

$text = preg_replace('/\\b(\\w{1,2}|\\w{20,})\\b/', ' ', $text);
Medlem sedan juni 2002116 inlägg
#5

Funkar prima, tackar.

251 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
125 ms — deklarationer (db)
0 ms — hämta statistik (cache)
123 ms — hämta tråd, inlägg och bilagor (db)
118 ms — ändringar (db)