Что нового

Создание "Белого списка" символов.

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Как проверить строку на отсутствие в ней любого символа не находящегося в заданном каким-либо образом, белом списке? И как вообще такой список организовать?
Мне например нужен список который пропускает лишь латинские буквы, цифры, символ "@" и символ "."
 

---Zak---

Скриптер
Сообщения
455
Репутация
120
Я бы сделал как-то так:
Код:
$aArray = StringRegExp('фыв', '[a-zA-Z0-9@.]', 0)
If $aArray = 1 Then
	ConsoleWrite('ЕСТЬ символы'&@CRLF)
Else
	ConsoleWrite('НЕТ символов'&@CRLF)
EndIf



flag = Поведение
0 = Возвращает 1 (совпадение найдено) или 0 (не найдено).
 
Автор
B

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Данная конструкция подойдет для создания списка недопустимых символов, но не могу представить как ее использовать в таком случае:
Код:
$aArray = StringRegExp('[email protected]//вас поимели', '[a-zA-Z0-9@.]', 0)
If $aArray = 1 Then
    ConsoleWrite('ЕСТЬ символы'&@CRLF)
Else
    ConsoleWrite('НЕТ символов'&@CRLF)
EndIf

тоесть тут присутствиют нужные символы, и ненужные, составить список всех недопустимых символов - задачка очень сложная, поэтому и хочу сделать список, который не пропускал бы строковое значение, если оно содержит хоть один символ отличный от тех, что указаны в белом списке.
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
Belfigor
Если строка содержит множество символов, не входящих в белый список, то она не подходит? Надо добавить "^" перед множеством

Код:
$aArray = StringRegExp('[email protected]//вас поимели', '[^a-zA-Z0-9@.]', 0)
If $aArray = 0 Then
    ConsoleWrite('Подходит' & @CRLF)
Else
    ConsoleWrite('НЕ подходит' & @CRLF)
EndIf
 

---Zak---

Скриптер
Сообщения
455
Репутация
120
Код:
If TEST('[email protected]//вас поимели') Then
	ConsoleWrite('НЕТ символов'&@CRLF)
EndIf

If TEST('Шаблон для проверки') Then
	ConsoleWrite('НЕТ символов'&@CRLF)
EndIf

Func Test($STR)
	If Not StringRegExp($STR, '[a-zA-Z0-9@.]', 0) Then
		Return 1
	EndIf
	SetError(1)
EndFunc


ЗЫ: дальше уже дело фантазии - можно массив создать с недопустимыми символами и бежать по нему через ту же функцию. Если найдет что-нибудь, то функция рубит на ошибку...
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Belfigor,
Можно так попробовать сделать.
Код:
$sStr = '[email protected]//вас поимели'
$iLen = StringLen($sStr)
StringRegExpReplace($sStr, '(?is)[\da-z@.]', '')
If @extended = $iLen Then
	ConsoleWrite('нет других символов' & @LF)
Else
	ConsoleWrite('есть другие символы' & @LF)
EndIf
ConsoleWrite('---' & @LF)
$sStr = '[email protected]'
$iLen = StringLen($sStr)
StringRegExpReplace($sStr, '(?is)[\da-z@.]', '')
If @extended = $iLen Then
	ConsoleWrite('нет других символов' & @LF)
Else
	ConsoleWrite('есть другие символы' & @LF)
EndIf
Или так.
Код:
$sStr = '[email protected]//вас поимели'
$sStr = StringRegExpReplace($sStr, '(?is)[\da-z@.]', '')
If $sStr Then
	ConsoleWrite('есть другие символы' & @LF)
Else
	ConsoleWrite('нет других символов' & @LF)
EndIf
ConsoleWrite('---' & @LF)
$sStr = '[email protected]'
$sStr = StringRegExpReplace($sStr, '(?is)[\da-z@.]', '')
If $sStr Then
	ConsoleWrite('есть другие символы' & @LF)
Else
	ConsoleWrite('нет других символов' & @LF)
EndIf
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Мой вариант
Код:
$List = "[email protected]"
$WhiteList = StringSplit($List, "")

$str = "[email protected]//вас поимели"

$array = StringSplit($str, "")
For $i = 1 To $array[0]
  For $j = 1 To $WhiteList[0]
    If $array[$i] = $WhiteList[$j] Then
      ExitLoop
    EndIf
  Next
  If $j = $WhiteList[0] + 1 Then
    ConsoleWrite("Недопустимый символ: " & $array[$i] & @CRLF)
    Exit
  EndIf
Next
ConsoleWrite($str)
 

mef-t

Осваивающий
Сообщения
306
Репутация
30
я бы еще добавил проверку на длину символов.
Код:
StringLen ( "string" )

Строка "" во всех предложенных будет правильной.
Хотя, думаю, это не так.
 
Автор
B

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Оооо, всем спасибо, буду разбираться и изучать. Полезная функция кстати для всех. Особенно когда хочешь ограничить юзеру возможность ввода определенных символов. Если делать это черным списком, то всё равно найдут как выкрутиться, если делать белым списком, то шанс получить именно то, что хочешь увеличивается :smile:
 
Верх