ugrás a tartalomhoz

Sztringből x karakternél rövidebb/hosszabb szavak törlése preg_replace-szel

KergeKacsa · 2006. Május. 5. (P), 16.39
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? :)
 
1

per b

Bártházi András · 2006. Május. 5. (P), 16.55
Szia!

\S helyett a szóhatár jelet használjad: \b.

Üdv,
András
3

nem per nagybé?

Anonymous · 2006. Május. 5. (P), 17.04
Szerintem a "nem whitespace" karakter helyett inkább a "nem szóhatár" karakter kellhet: \B, de ettől még megeszi a spaceket.

üdv: imr
4

még nem jó

KergeKacsa · 2006. Május. 5. (P), 17.08
preg_replace('/[ ]([\b]{1,3}|[\b]{21,})[ ]/',' ', $entry)

így? Mert így konkrétan teljesen érintetlenül adja ki a sztringet. :(
2

[ ] felesleges

Anonymous · 2006. Május. 5. (P), 16.57
minek a végére a space?

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
5

ha nincs space a végén

KergeKacsa · 2006. Május. 5. (P), 17.11
Végeredmény: om tő la mét alábbhúszbetűsszavacska

Nem teljes szavakat néz, hanem minden space után jövő három karaktert töröl.
6

Hmmm ...

Anonymous · 2006. Május. 5. (P), 17.13
Na akkor utánnajárok pontosabban.

üdv: imr
7

na talán ez

Anonymous · 2006. Május. 5. (P), 17.15
print_r(preg_replace('/\b([\S]{1,3}|[\S]{21,})\b/','', $entry));

üdv: imr
8

Nyert :)

KergeKacsa · 2006. Május. 5. (P), 17.26
Köszi, ez jól müködik :)

Gondolom András is ilyesmire gondolt. :)

Ezer hála :)
10

Nyert?

Balogh Tibor · 2006. Május. 5. (P), 18.56
A következő két pattern mért viselkedik máshogy, akkor is, ha csak szóköz a szóelválasztó a szövegben? A másodiknál a szóköz szerepel a találatban, míg az elsőnél a szóhatár nem.

'!\b([\w]{1,3}|[\w]{21,})\b!u'
'!\s([\w]{1,3}|[\w]{21,})\s!u'
11

Szóhatár

Bártházi András · 2006. Május. 6. (Szo), 00.14
Ha jól értem a kérdést, akkor a válasz: a \b egy nulla karakter hosszú elem. Egy két karakter között álló extra elemként tudod a legjobban elképzelni.
12

Szóhatár

Balogh Tibor · 2006. Május. 6. (Szo), 11.49
Ha jól értem a kérdést

Egy példa jobban megvilágítja, ha homályosan sikerült fogalmaznom:

<?php
$text = 'három egy kettő az a széles és legalabbhuszbetusszavacska a';

print($text);
print(preg_replace('!\b(\w{1,3}|\w{21,})\b!u', '', $text));
print(preg_replace('!\s(\w{1,3}|\w{21,})\s!u', '', $text));
print(preg_replace('!\s(\w{1,3}|\w{21,})(?=\s)!u', '', $text));
?>
Kimenet:
három egy kettő az a széles és legalabbhuszbetusszavacska a

három  kettő   széles   <
     ^^     ^^^      ^^^
háromkettőa széleslegalabbhuszbetusszavacska a<
három kettő széles a<


a \b egy nulla karakter hosszú elem

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.
9

akkor dupla space-k lesznek :)

toxin · 2006. Május. 5. (P), 17.26
csapó x+1
<?php
$entry=' három kettő egy nulla az a széles legalábbhúszbetűsszavacska ';
echo preg_replace('/(|\s)\b([\S]{1,3}|[\S]{21,})\b/', '', $entry);

?>