scheldwoorden filter

Status
Niet open voor verdere reacties.

Jardin

Gebruiker
Lid geworden
14 mei 2010
Berichten
26
Hi!
Ik run een datingsite waar nogal eens leden zich inschrijven met behoorlijk grof taalgebruik.(die moet ik steeds aanmanen dit te veranderen en dat is veel werk.)
Nu heb ik (eindelijk) een javascript scheldwoordenfilter gevonden die werkt in mijn .tpl signup pagina..
Het enige (grote) probleem is dat het script alle gevonden woorden (dus ook delen ervan) filtert
m.a.w. als ik in de var swear_words_arr=new Array list het woord "lamp" opgeef dan filter de functie ook "lampion"

Ik heb mezelf al een slag in de ronte gezocht maar kan niet vinden wat ik moet veranderen in de code
zodat hij niet delen van woorden ook filtert..

Code:
<script type="text/javascript">
var swear_words_arr=new Array("lamp",enz enz);
var swear_alert_arr=new Array(); 
var swear_alert_count=0; 

function reset_alert_count() 
{
swear_alert_count=0; 
}

function wordFilter(form,fields) 
 {
reset_alert_count(); 
var compare_text; 
var fieldErrArr=new Array(); 
var fieldErrIndex=0; 
for(var i=0; i<fields.length; i++) 
{
eval('compare_text=document.' + form + '.' + fields[i] + '.value;'); 
for(var j=0; j<swear_words_arr.length; j++) 
{
for(var k=0; k<(compare_text.length); k++) 
{
if(swear_words_arr[j]==compare_text.substring(k,(k+swear_words_arr[j].length)).toLowerCase()) 
{
swear_alert_arr[swear_alert_count]=compare_text.substring(k,(k+swear_words_arr[j].length)); 
swear_alert_count++; 
fieldErrArr[fieldErrIndex]=i; 
fieldErrIndex++; 
}
}
}
}
var alert_text=""; 
for(var k=1; k<=swear_alert_count; k++) 
{
alert_text+="\\n" + "(" + k + ") " + swear_alert_arr[k-1]; 
eval('compare_text=document.' + form + '.' + fields[fieldErrArr[0]] + '.focus();'); 
eval('compare_text=document.' + form + '.' + fields[fieldErrArr[0]] + '.select();'); 
}
if(swear_alert_count>0) 
{
alert("Er is een fout gevonden!.\\nDe volgende woorden mogen niet gebruikt worden:\\n_______________________________\\n" + alert_text + "\\n_______________________________"); 
return false; 
}
else 
{
return true; 
}
}
</script>
Weet iemand wat te veranderen?
Help wordt zeer op prijs gesteld!
mvg
Jardin
 
Ik heb je script niet helemaal uitgepluist, want het lijkt nodeloos ingewikkeld, maar wellicht een simpele optie is om de woorden met een leading- en trailing- space in de array te zetten.

[JS]
var swear_words_arr=new Array(" lamp ",enz enz);
[/JS]
 
Vele malen bedankt ErikBooy007!! ...daar heb ik dus zeer lang op geploeterd ...het enige nog is dat als iemand een woord uit de lijst als eerste gebruikt in het formulier of na een regeleinde (punt) dan wordt deze niet herkend...
Zou daar ook nog een oplossing voor zijn?

mvg
Jardin
 
Je kan ook gewoon een normaal scriptje hiervoor zoeken / maken, want deze doet rare dingen zoals
[JS]eval('compare_text=document.' + form + '.' + fields + '.value;'); [/JS]
Het is helemaal niet lastig; zoiets volstaat:

[JS]function filter(veldID)
{
var elem = document.getElementById(veldID).innerHTML; // of .value, als je input type='text' hebt

var woorden = ['lamp', 'test', 'moar'];

var i, len = woorden.length;

for(i=0; i<len; i++)
{
elem.replace(/woorden/gi, '****'); // weet niet zeker of dit werkt thought door de regex, anders moet het via de constructor...
}
}[/JS]en dan als html + aanroep:
HTML:
<textarea id='testveld'></textarea>

<button onclick='filter("testveld");'>filter</button>
:thumb:


ohja, trouwens, dit soort dingen kunnen beter gefilterd worden in een server-side taal (zoals php); iemand kan namelijk Javascript uit hebben staan....
 
Laatst bewerkt:
ohja, trouwens, dit soort dingen kunnen beter gefilterd worden in een server-side taal (zoals php); iemand kan namelijk Javascript uit hebben staan....

Mee eens, mocht je het toch (ook) in Javascript willen doen, kan je gebruik maken van een regular expression en "word boundaries" (\b). Voorbeeldje:
HTML:
<html>
<body>
<script>
var test = "lampion";
var test2 = "lavalamp";
var test3 = "lamp";
document.writeln(test.replace(/\blamp\b/gi, "****") + "<br>");
document.writeln(test2.replace(/\blamp\b/gi, "****") + "<br>");
document.writeln(test3.replace(/\blamp\b/gi, "****") + "<br>");
</script>
</body>
</html>
Dit levert op:
lampion
lavalamp
****
 
Zeeer bedankt voor de reakties zover!...ik moet zeggen dat ik eerst inderdaad geprobeerd heb om een php scheldwoorden filter te gebruiken en dat zijn er zeeer veel! ...echter mijn signup pagina is van het type .tpl ...deze is enorm ingewikkeld met al een zeer zware validatieop alle velden/ een php werkt niet in een .tpl file...degene die ik hier neergezet heb is na lang zoeken de enige die ook daadwerkelijk werkt dus vóórdat de inschrijving wordt ingestuurd en mé een popup alert..

Ik ben dus huiverig om wéér een nieuwe te proberen...ik denk dat ik maar gewoon voor lief neem dat het eerste woord en het woord na een punt niet gefiltert woorden.

wat is dit eigenllijk :)
eval('compare_text=document.' + form + '.' + fields + '.value;');


thanks!
mvg
Jardin
 
Laatst bewerkt:
Om even terug te komen op het begin: ik zie het nut niet zo, om combi-woorden er wel door te laten. Neem bijvoorbeeld het rijtje (u begrijpt wat ik bedoel):
  • lol
  • lol312
  • lolhannes
  • boerenlol
Dan gooit het filter er alleen de eerste uit. Is de rest dan o.k.?
Voor 99% niet, lijkt me. Die moet je er dan alsnog met de hand uitkachelen - dat spaart geen werk. :(
  • Nadeel is, dat er een enkel combi-woord door zal sluipen.
  • Dat gebeurt ook hier op het forum, waar ook een filter op zit. Als ik hier smush.it.com intik zonder het eerste puntje (de naam van een site met een respectabel online tooltje van Yahoo), maakt het forumfilter er smu****.com van, en ook een link ernaartoe werkt niet. Want het filter denkt dat het een combi-woord is met s.h.i.t er in. *)
  • Maar ik denk dat dit nadeel in de praktijk heel erg mee zal vallen. Desnoods moet iemand een andere naam verzinnen, als het zo'n toevallig combiwoord is, s***sjevaarder ofzo ;).
Met vriendelijke groet,
CSShunter
_________
*) Gelukkig heeft Yahoo ook een alternatief met een andere domeinnaam bedacht voor dit soort filters; de link www.smush.it doet het wel, en vandaaruit kun je door naar smu****.com.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan