12.04.2012, 12:20
Кирилл, правильно формулируйте свой вопрос, прежде чем отправлять.
stock remove_bad_word(text[])
{
static words[][32] = {"бля"};
static exceptions[][32] = {"оскорбля"};
new i, j, k, pos, epos, len;
for (i = 0; i < sizeof(words); i++)
{
while ( (pos = strfind(text, words[i], true, pos+1)) != -1 )
{
len = strlen(words[i]);
for (j = 0; j < sizeof(exceptions); j++)
{
epos = strfind(text, exceptions[j], true, epos);
if (epos != pos-(strlen(exceptions[j])-len))
{
for (k = pos; k < pos+len; k++)
{
text[k] = '*';
}
}
else
{
epos++;
}
}
}
}
}
Вот, список исключений заполняется без окончаний, ибо их очень много
pastebin.com pawn Код:
|
stock remove_bad_word(text[])
{
static words[][32] = {"бля"};
static exceptions[][32] = {"оскорбля"};
new i, j, k, pos, epos, len;
for (i = 0; i < sizeof(words); i++)
{
while ( (pos = strfind(text, words[i], true, pos+1)) != -1 )
{
len = strlen(words[i]);
for (j = 0; j < sizeof(exceptions); j++)
{
epos = strfind(text, exceptions[j], true, epos);
if (epos != pos-(strlen(exceptions[j])-len))
{
for (k = pos; k < pos+len; k++)
{
text[k] = '*';
}
}
else
{
epos++;
}
}
}
}
}
if ( remove_bad_word(text))
{
SendClientMessage( playerid, COLOR_RED, WARN_MS_PREFIX "мат" );
return 0;
}
а соединять пробывал с стоком таким образом
pawn Код:
|
stock remove_bad_word(text[])
{
static words[][32] = {"бля"};
static exceptions[][32] = {"оскорбля"};
new i, j, pos, epos, len;
for (i = 0; i < sizeof(words); i++)
{
while ( (pos = strfind(text, words[i], true, pos+1)) != -1 )
{
len = strlen(words[i]);
for (j = 0; j < sizeof(exceptions); j++)
{
epos = strfind(text, exceptions[j], true, epos);
if (epos != pos-(strlen(exceptions[j])-len))
{
return 1;
}
else
{
epos++;
}
}
}
}
return 0;
}
Моя функция фильтрует мат, т.е. заменяет матерные слова на * (звёздочки). Как я понял - ты хочешь, чтобы сообщения с матами вообще не отправлялись, тогда вот:
pawn Код:
|
remove_bad_word(text[]) {
static words[][32] = {"bla"};
static exceptions[][32] = {"vobla"};
for (new i, pos; i < sizeof(words); i++) {//check all words
while ((pos = strfind(text, words[i], true, pos)) != -1) {//if found
for (new j, inpos; j < sizeof(exceptions); j++) {//chec all exceptions
while ((inpos = strfind(exceptions[j], words[i], true)) != -1 ) {//check only exception with founded word
if (strfind(text, exceptions[j], true) != (pos - inpos)) {//this is not exception
return 1;//found word is bad word
} else {
break;//go to next exception
}
}
}
pos++;
}
}
return 0;
}