[PHP]Letters omzeilen tegengaan

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Skate2000
  • Registratie: November 1999
  • Laatst online: 29-12-2024
Hay allemaal, stel, ik heb een woord die ik niet toelaat in een bepaalde situatie. Het is alleen zo, dat wanneer je een woord anders typt, dus met een cijfer ipv een letter, je toch het woord duidelijk leesbaar kunt plaatsen voor mensen, maar niet voor een machine, die denkt dat het iets anders is. Dus dan is het niet plaatsen van het woord te omzeilen.

Wat is het probleem?

Stel, ik wil dat het woord "koe" opgemerkt wordt. Dat is niet zo moeilijk, maar nu wil ik ook dat het woord "k0e", "k03" of "ko3" wordt opgemerkt.

Dit door een array te hebben met letters die worden vervangen:
PHP:
1
2
3
4
5
6
x == array(
'o' => '0',
'e' => '3',
'a' => '@'
'a' => '4'
);


Hoe zou ik het woord "koe" dan in hemelsnaam kunnen checken op het wel of niet goedzijn, rekening houdend met het feit dat mensen het ook foutief kunnen schrijven, zoals in de array is beschreven?

edit:
Zelfde vraag, andere uitleg:
PHP:
1
if (preg_match ("/koe/i", "$text"))

Hier zie je dat er wordt gecheckt of "koe" in $text voorkomt, zoja: TRUE! Ik wil dus dat het ook werkt met "k03" enzo..

Hiervoor een loopje, maar hoe ga ik alle letters af?

[ Voor 26% gewijzigd door Skate2000 op 23-07-2003 16:46 . Reden: aanvulling ]


Acties:
  • 0 Henk 'm!

  • chem
  • Registratie: Oktober 2000
  • Laatst online: 11-09 11:19

chem

Reist de wereld rond

PHP:
1
preg_match('/k[o0][e3]/i',$string);

Klaar voor een nieuwe uitdaging.


Acties:
  • 0 Henk 'm!

  • Sn3akz
  • Registratie: November 2000
  • Laatst online: 05-08 13:55
chem schreef op 23 July 2003 @ 16:43:
PHP:
1
preg_match('/k[o0][e3]/i',$string);
Lekker makkelijk als je een hele zooi woorden heb :D Dit is verdomd lastig in een lusje te proppen :)

[ Voor 4% gewijzigd door Sn3akz op 23-07-2003 16:45 ]


Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 12:54

Bosmonster

*zucht*

Wat je dan eerst moet doen is voor ieder woord de mogelijk combinaties 'berekenen' met je lettermogelijkheden. Vervolgens op die mogelijkheden checken en doorgaan naar het volgende woord.

Of alles in een keer berekenen en een compleet nieuwe array samenstellen.

offtopic:
Eerlijk gezegd vind ik deze vorm van censuur nogal nutteloos...

Acties:
  • 0 Henk 'm!

  • chem
  • Registratie: Oktober 2000
  • Laatst online: 11-09 11:19

chem

Reist de wereld rond

Je moet dan idd elk woord char-by-char nalopen met bovenstaande methode, en alle letters die in de array voorkomen in [ ] proppen (implode).
Dat is een vrij CPU-intensief karweitje trouwens.

Klaar voor een nieuwe uitdaging.


Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 12:54

Bosmonster

*zucht*

Sn3akz schreef op 23 juli 2003 @ 16:45:
[...]

Lekker makkelijk als je een hele zooi woorden heb :D Dit is verdomd lastig in een lusje te proppen :)
Niet als je al je mogelijke foute woorden als regexp opslaat en in een keer met preg_match er doorheen ragt.
Je moet dan idd elk woord char-by-char nalopen met bovenstaande methode, en alle letters die in de array voorkomen in [ ] proppen (implode).
Dat is een vrij CPU-intensief karweitje trouwens.
Op die manier kan ook.. de regexps genereren... is wel erg makkelijk te cachen zo'n lijstje (verandert niet zo vaak neem ik aan).
Dit wordt zeer moeilijk voor een grote lap tekst. En wat als ze er een puntje tussen zetten ofzo ? Ik kan dan nog mooi ko.e schrijven. Het blijft leesbaar, en je script zal dit al niet vinden.
Inderdaad.. tis nogal nutteloos dat woorden vervangen.. :)

[ Voor 54% gewijzigd door Bosmonster op 23-07-2003 16:49 ]


Acties:
  • 0 Henk 'm!

  • DinX
  • Registratie: Februari 2002
  • Laatst online: 13:27

DinX

Motormuis

Dit wordt zeer moeilijk voor een grote lap tekst. En wat als ze er een puntje tussen zetten ofzo ? Ik kan dan nog mooi ko.e schrijven. Het blijft leesbaar, en je script zal dit al niet vinden.

Marokko 2015: Route
Sat Tracker: SpotWalla
Blog: Gone for a ride


Acties:
  • 0 Henk 'm!

  • Skate2000
  • Registratie: November 1999
  • Laatst online: 29-12-2024
Sn3akz schreef op 23 juli 2003 @ 16:45:
[...]

Lekker makkelijk als je een hele zooi woorden heb :D Dit is verdomd lastig in een lusje te proppen :)
Ja, dat lijkt mij dus ook. Koe is nl. een van de (ongeveer) 70 woorden (in een array). Ik wil gewoon een 2e array maken met letters die door cijfers vervangen kunnen worden, zodat ik in één keer alle woorden met evt. truukjes kan matchen :) .

Acties:
  • 0 Henk 'm!

  • ekoopman
  • Registratie: April 2003
  • Laatst online: 13-09 16:08
Kan je niet in al die sets letters (3-e, 0-o-O) eentje aanwijzen als je "hoofd character" uit die set, dan al je input met str_replace bewerken zodat als je een element uit een set vindt je het vervangt door je hoofd character en dan nog een keer regexp'en op de verboden woorden. Zo doe je in ieder geval een aantal parses over je hele input die niet afhankelijk is van je bericht grootte.

Acties:
  • 0 Henk 'm!

  • Skate2000
  • Registratie: November 1999
  • Laatst online: 29-12-2024
Je bedoelt hier, eerst alle 3's door e's vervangen, en dan pas de check doen? Hmz.. dat is wel een goede ja.. in mijn geval kan dat wel eens werken! Thnx...

Maar in een andere situatie, waar je ook cijfers moet kunnen typen, werkt het dus niet, omdat dan overal andere letters van worden gemaakt.. :(

Acties:
  • 0 Henk 'm!

Verwijderd

Je zou denk ik een soort SoundEx functie moeten maken, zoek maar 's op SoundEx en z'n broertje ...... (kan ff niet op de naam komen van het andere bekende algorithme, zoek ik vanavond ff op.

Acties:
  • 0 Henk 'm!

  • ekoopman
  • Registratie: April 2003
  • Laatst online: 13-09 16:08
Je hoeft niet perse de ge-edite input als dusdanig op te slaan, maak er een kopietje van en gebruik dat om te matchen, aangezien de posities van foute woorden niet verandert kan je na het filteren in je originele input alleen die woorden eruit gooien

Acties:
  • 0 Henk 'm!

  • JeroenB
  • Registratie: November 1999
  • Laatst online: 17-09 19:50
Wat je zou kunnen doen is het probleem andersom benaderen. In plaats van dat je 70 woorden die qua inhoud kunnen varieren en waarvan je dan dus 70 x aantal_variaties de hele tekst moet doorlopen kun je ook de tekst zelf aanpassen. Je maakt een kopie van de totale tekst en vervangt dan alle niet-standaard letters (zoals cijfers) door hun tegenhangers als ze als letter moeten worden gelezen. Het enige dat je daarna dan nog moet doen is die 70 woorden stuk voor stuk erop matchen. Als je dan een hit hebt weet je dat er zo'n woord op die offset in de oorspronkelijke tekst staat.

Je neemt dan dus die array die je in de eerste post hebt gemaakt en doet per karakter erin een grote replace actie (dus alle @ worden a, alle 3 worden e, etc.) Dan moet overal waar koe, ko3, k0e, k03, etc. staat veranderen in koe en kan je erop matchen.

Het blijft een vrij intensieve actie maar dat is zo'n uitgebreide filter toch wel :) Ik verwacht dat het qua performance wel beter is dan apart matchen op alle variaties van de woorden die je zoekt. Je zou ook nog alle leestekens (behalve whitespace) eruit kunnen filteren voordat je matcht zodat je ook variaties als ko.e kunt detecteren. Let er dan wel op dat je conversies moet uitvoeren op je offsets omdat de lengte van je temp string dan anders wordt :)

edit: Kroxigor en ik zaten blijkbaar hetzelfde idee tegelijk in te typen! Hopelijk heb je toch iets aan mijn uitleg.

[ Voor 5% gewijzigd door JeroenB op 23-07-2003 16:58 ]


Acties:
  • 0 Henk 'm!

  • Roa
  • Registratie: December 2002
  • Laatst online: 03-07-2024

Roa

Het is niet echt een bijdrage aan je topic, ik weet het, maar waarom zou je dit doen? Dit soort filters worden ALTIJD omzeild. Strax bedenk je dat ze er netzogoed een , . of een : tussen kunnen zetten. Het is gewoon water naar de zee dragen.

Research is what I'm doing when I don't know what I'm doing.


Acties:
  • 0 Henk 'm!

  • Skate2000
  • Registratie: November 1999
  • Laatst online: 29-12-2024
Dat weet ik wel, maar het gaat erom, dat het de meeste dingen afvangt, tuurlijk kun je er ook omheen. Waarom doe jij je raam dicht als je van huis gaat? Inbrekers kunnen 'm toch ook gewoon doorgooien? Zijn ze ook binnen!

Als je zo gaat denken kun je maar beter de hele dag in bed blijven liggen, alles is toch voor niets...

Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 12:56
Kun je het niet anders aanpakken: kun je niet een lijstje maken met verschillende woorden die niet mogen, dus koe, schaap enzovoorts. Dab bereken je het verschil tussen het woord en het verboden woord. Je loopt per woord dus de array met vebroden woorden door. In PHP zit zo'n functie om het verschil te bereken d8 ik. Die gebruiken ze ook hier op het forum om de edit % aan te geven.

Acties:
  • 0 Henk 'm!

Verwijderd

Hier de uitleg van dat soundex, je kan er natuurlijk een eigen variatie op maken:
http://www.myatt.demon.co.uk/sxalg.htm

Acties:
  • 0 Henk 'm!

  • Tjark
  • Registratie: Juni 2000
  • Laatst online: 08:29

Tjark

DON'T PANIC

soundex werkt ook niet altijd.

soundex(kut) == soundex(cut)

*insert signature here


Acties:
  • 0 Henk 'm!

  • Carnifex
  • Registratie: Januari 2000
  • Laatst online: 10:03

Carnifex

auch

Een andere oplossing, naast het filteren met regexpr, is het aanstellen van een 'corrector' die de ingezonden teksten leest en de woorden die niet mogen aanklikt. Deze worden dan in een database oid opgeslagen zodat alle volgende voorvallen ervan in toekomstige teskten automatisch kunnen worden verwijderd.
In het begin behoorlijk arbeids intensief, maar je haalt er uiteindelijk wel de beste resultaten mee. Vooral als er bepaalde 'mode woorden' of nieuwe woorden worden uitgevonden.

Als je ff een nette interface verzint, die het selecteren van woorden makkelijk maakt, dan kun je in een paar uur toch al heel veel woorden verbeteren.

Dit fine-tunen zal altijd wel mensenwerk blijven aangezien een (computer)systeem totaal geen begrip heeft van woorden.

[ Voor 5% gewijzigd door Carnifex op 23-07-2003 17:43 . Reden: typo's ]


Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 12:54

Bosmonster

*zucht*

TjarkVerhoeven schreef op 23 July 2003 @ 17:36:
soundex werkt ook niet altijd.

soundex(kut) == soundex(cut)
Het werkt wel.. maar uiteraard niet tussen verschillende talen ;)

Acties:
  • 0 Henk 'm!

Verwijderd

het idee is wel vet, zekers als je een spam filter wilt bouwen die ook spaces checkt endergelijke.

Acties:
  • 0 Henk 'm!

  • Skate2000
  • Registratie: November 1999
  • Laatst online: 29-12-2024
Thnx voor alle leuke ideeen, ik ga even iets maken. :)
Pagina: 1