PHP код:
ParseReferences(const text[], output[], size = sizeof(output))
{ // by Daniel_Cortez \\pro-pawn.ru
static size_m_1, nickname_pos1, nickname_pos2, ref_playerid, pos1, pos2, c;
size_m_1 = size - 1;
pos1 = 0, pos2 = strlen(output);
for(;;)
{
if(text[pos1] == '@')
{
nickname_pos1 = pos1, nickname_pos2 = pos2;
ref_playerid = 0;
while((c = text[++pos1]), '0' <= c <= '9')
ref_playerid = ref_playerid * 10 + (c - '0');
pos2 += GetPlayerName(
ref_playerid,
output[nickname_pos2],
size - nickname_pos2
);
if(pos2 == nickname_pos2)
output[pos2++] = '@', pos1 = nickname_pos1 + 1;
}
else if((output[pos2++] = text[pos1++]) == '\0')
break;
if(pos2 == size_m_1)
{
output[pos2] = '\0';
break;
}
}
}
Пример использования:
PHP код:
public OnPlayerText(playerid, text[])
{
new parsed_text[144+1];
GetPlayerName(playerid, parsed_text, sizeof(parsed_text));
strcat(parsed_text, " сказал: ");
ParseReferences(text, parsed_text);
SendClientMessageToAll(-1, parsed_text);
return 0;
}
P.S.: С вариантом от OKStyle сравнивать нет смысла из-за неправильной работы последнего. С другими вариантами (при предоставлении оных в этой теме) могу сравнить, как по валидности работы алгоритма, так и по производительности, но уже не сегодня.