Sztringből x karakternél rövidebb/hosszabb szavak törlése preg_replace-szel
Sziasztok!
Adva van egy kód, aminek feladata a 4 karakternél rövidebb illetve a 20 karakternél hosszabb szavak törlése.
$entry=' három kettő egy nulla az a széles legalábbhúszbetűsszavacska ';
print_r(preg_replace('/[ ]([\S]{1,3}|[\S]{21,})[ ]/',' ', $entry));
Ezt adja ki: három kettő nulla a széles
Magyarul, ha 2 olyan szó van egymás után ami beleeesik a szórásba, akkor a másodikat nem törli, gondolom azért, mert úgy érzékeli, hogy az első szó utáni szóköz az első karakterhez tartozik, így viszont a második szó elött nem lát szóközt.
Hogyan lehetne ezt megoldani?
Amikre én gondoltam: vagy minden szóközt megduplázni, még a preg_replace elött, vagy egymás után kétszer lefuttatni a preg_replace-t.
Szerintetek? Van valami kevésbé sufnimegoldás is erre? :)
■ Adva van egy kód, aminek feladata a 4 karakternél rövidebb illetve a 20 karakternél hosszabb szavak törlése.
$entry=' három kettő egy nulla az a széles legalábbhúszbetűsszavacska ';
print_r(preg_replace('/[ ]([\S]{1,3}|[\S]{21,})[ ]/',' ', $entry));
Ezt adja ki: három kettő nulla a széles
Magyarul, ha 2 olyan szó van egymás után ami beleeesik a szórásba, akkor a másodikat nem törli, gondolom azért, mert úgy érzékeli, hogy az első szó utáni szóköz az első karakterhez tartozik, így viszont a második szó elött nem lát szóközt.
Hogyan lehetne ezt megoldani?
Amikre én gondoltam: vagy minden szóközt megduplázni, még a preg_replace elött, vagy egymás után kétszer lefuttatni a preg_replace-t.
Szerintetek? Van valami kevésbé sufnimegoldás is erre? :)
per b
\S
helyett a szóhatár jelet használjad:\b
.Üdv,
András
nem per nagybé?
üdv: imr
még nem jó
így? Mert így konkrétan teljesen érintetlenül adja ki a sztringet. :(
[ ] felesleges
Ha nem lenne ott jól működne .... [\S] -sel megmondod neki azt ami neked kell.
(amúgy az elejére sem kell, pl ha az első szóra illeszkedne és nem raknál oda sufni space-t akkor mi van?)
amúgy az jó neked, hogy a "egy," bennmarad? vagy arról elöbb gondoskodsz, h ilyen ne legyen?
üdv: imr
ha nincs space a végén
Nem teljes szavakat néz, hanem minden space után jövő három karaktert töröl.
Hmmm ...
üdv: imr
na talán ez
üdv: imr
Nyert :)
Gondolom András is ilyesmire gondolt. :)
Ezer hála :)
Nyert?
'!\s([\w]{1,3}|[\w]{21,})\s!u'
Szóhatár
\b
egy nulla karakter hosszú elem. Egy két karakter között álló extra elemként tudod a legjobban elképzelni.Szóhatár
Egy példa jobban megvilágítja, ha homályosan sikerült fogalmaznom:
három kettő széles <
^^ ^^^ ^^^
háromkettőa széleslegalabbhuszbetusszavacska a<
három kettő széles a<
Akkor egy nagyon jó kis elem!
Illeszkedik szóhatárra akkor is, ha az a szöveg elején vagy végén van, és nem szerepel a találatok között. Ami azért néha gondot jelent, hogy az elválasztó karakter feleslegesen ott van. Nem kell használni előre vagy visszatekintés a patternben.
Nos, most már világos. A \b nem karakter.
akkor dupla space-k lesznek :)