19.10.2016, 00:27
That's obviously going to fail, it isn't that simple as you could simply put characters in between and it won't detect an "IP". Detecting the port isn't necessary, however.
Here's a function I have, it could probably be improved, but it's just fine how it is (note that it's strict). Regex seems to be a lot slower either way.
Regex (also strict):
Here's a function I have, it could probably be improved, but it's just fine how it is (note that it's strict). Regex seems to be a lot slower either way.
PHP код:
// ** INCLUDES
#include <a_samp>
#include <sscanf>
// ** DEFINES
// *** FUNCTIONS
#define strcpy(%0,%1,%2) strcat((%0[0] = '\0', %0), %1, %2)
#define isnull(%1) ((!(%1[0])) || (((%1[0]) == '\1') && (!(%1[1]))))
// ** MAIN
main()
{
print("Loaded \"anti_advert.amx\".");
}
// ** CALLBACKS
public OnGameModeInit()
{
return 1;
}
public OnGameModeExit()
{
return 1;
}
public OnPlayerText(playerid, text[])
{
if(IsAdvertisement(text))
{
SendClientMessage(playerid, 0xFFFFFFFF, "{FF0000}[ERROR]: {FFFFFF}Your message contains an IP Address (strict detection).");
return 0;
}
return 1;
}
// ** FUNCTIONS
stock IsAdvertisement(text[])
{
new message[128], extract[2], element[4][4], count_1, count_2, temp, bool:number_next = false, bool:next_number = false;
strcpy(message, text, sizeof(message));
for(new i = 0, j = strlen(message); i < j; i ++)
{
switch(message[i])
{
case '0'..'9':
{
if(next_number)
{
continue;
}
number_next = false;
strmid(extract, message[i], 0, 1);
strcat(element[count_1], extract);
count_2 ++;
if(count_2 == 3 || message[i + 1] == EOS)
{
strmid(extract, message[i + 1], 0, 1);
if(IsNumeric(extract))
{
element[0][0] = EOS;
element[1][0] = EOS;
element[2][0] = EOS;
element[3][0] = EOS;
count_1 = 0;
count_2 = 0;
next_number = true;
continue;
}
temp = strval(element[count_1]);
if(count_1 == 0)
{
if(temp <= 255)
{
count_1 ++;
count_2 = 0;
}
else
{
element[count_1][0] = EOS;
count_2 = 0;
next_number = true;
}
}
else
{
if(temp <= 255)
{
count_1 ++;
count_2 = 0;
}
else
{
element[0][0] = EOS;
element[1][0] = EOS;
element[2][0] = EOS;
element[3][0] = EOS;
count_1 = 0;
count_2 = 0;
next_number = true;
}
}
}
if(count_1 == 4)
{
return 1;
}
}
default:
{
next_number = false;
if(number_next)
{
continue;
}
if(!isnull(element[count_1]))
{
temp = strval(element[count_1]);
if(count_1 == 0)
{
if(temp <= 255)
{
count_1 ++;
count_2 = 0;
number_next = true;
}
else
{
element[count_1][0] = EOS;
count_2 = 0;
}
}
else
{
if(temp <= 255)
{
count_1 ++;
count_2 = 0;
number_next = true;
}
else
{
element[0][0] = EOS;
element[1][0] = EOS;
element[2][0] = EOS;
element[3][0] = EOS;
count_1 = 0;
count_2 = 0;
}
}
if(count_1 == 4)
{
return 1;
}
}
}
}
}
return 0;
}
stock IsNumeric(const string[])
{
return !sscanf(string, "{d}");
}
PHP код:
// ** INCLUDES
#include <a_samp>
#include <regex>
// ** DEFINES
// *** FUNCTIONS
#define strcpy(%0,%1,%2) strcat((%0[0] = '\0', %0), %1, %2)
// ** MAIN
main()
{
print("Loaded \"anti_advert_regex.amx\".");
}
// ** CALLBACKS
public OnGameModeInit()
{
return 1;
}
public OnGameModeExit()
{
return 1;
}
public OnPlayerText(playerid, text[])
{
if(IsAdvertisement(text))
{
SendClientMessage(playerid, 0xFFFFFFFF, "{FF0000}[ERROR]: {FFFFFF}Your message contains an IP Address (strict detection).");
return 0;
}
return 1;
}
// ** FUNCTIONS
stock IsAdvertisement(text[])
{
new message[128], build, expression[] = "(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.+){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)", start, end;
strcpy(message, text, sizeof(message));
for(new i = 0, j = strlen(message); i < j; i ++)
{
switch(message[i])
{
case '0'..'9':
{
continue;
}
case '.':
{
continue;
}
default:
{
strdel(message, i, i + 1);
strins(message, ".", i);
}
}
}
build = regex_exbuild(expression);
regex_exmatch(message, build);
regex_exsearch(message, build, start, end);
if(start >= 0)
{
return 1;
}
return 0;
}