Как проверить, находится ли строка в массиве? - PullRequest
5 голосов
/ 20 июля 2010

Мне в основном нужна функция для проверки того, находятся ли символы строки (каждый символ) в массиве.

Мой код пока не работает, но здесь все равно,

$allowedChars = array("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"," ","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"," ","0","1","2","3","4","5","6","7","8","9"," ","@",".","-","_","+"," ");

$input = "Test";
$input = str_split($input);

if (in_array($input,$allowedChars)) {echo "Yep, found.";}else {echo "Sigh, not found...";}

Я хочу сказать: «Да, нашел».если одна из букв в $ input найдена в $allowedChars.Достаточно просто, верно?Ну, это не работает, и я не нашел функцию, которая будет искать отдельные символы строки для значения в массиве.

Кстати, я хочу, чтобы это были только значения этих массивов,Я не ищу причудливые html_strip_entities или что-то еще, я хочу использовать этот точный массив для разрешенных символов.

Ответы [ 5 ]

6 голосов
/ 20 июля 2010

Вы действительно должны изучить регулярное выражение и функцию preg_match: http://php.net/manual/en/function.preg-match.php

Но это должно заставить ваш конкретный запрос работать:

$allowedChars = array("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"," ","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"," ","0","1","2","3","4","5","6","7","8","9"," ","@",".","-","_","+"," ");
$input = "Test";
$input = str_split($input);
$message = "Sigh, not found...";
foreach($input as $letter) {
    if (in_array($letter, $allowedChars)) {
        $message = "Yep, found.";
        break;
    }
}
echo $message;
4 голосов
/ 20 июля 2010

Вы знакомы с регулярными выражениями вообще?Это своего рода более приемлемый способ делать то, что вы пытаетесь сделать, если я не пропускаю что-то здесь.

Взгляните на preg_match (): http://php.net/manual/en/function.preg-match.php

По адресуНапример, вот пример кода ( ОБНОВЛЕНО ДЛЯ ОБРАЩЕНИЯ С ВОПРОСАМИ В КОММЕНТАРИИ ):

$subject = "Hello, this is a string";
$pattern = '/[a-zA-Z0-9 @._+-]*/'; // include all the symbols you want to match here

if (preg_match($pattern, $subject))
    echo "Yep, matches";
else
    echo "Doesn't match :(";

Небольшое объяснение регулярного выражения: '^' соответствует началу строки,Часть «[a-zA-Z0-9 @ ._ + -]» означает «любой символ в этом наборе», после «*» - «ноль или более из последней вещи», и, наконец, «$» вконец соответствует концу строки.

1 голос
/ 12 октября 2017

Проверка символов в строке наиболее подходящим образом выполняется с помощью строковых функций.
preg_match() является наиболее прямым / элегантным методом для этой задачи.

Код: ( Демо )

$input="Test Test Test Test";
if(preg_match('/^[\w +.@_-]*$/',$input)){
    echo "Input string does not contain any disallowed characters";
}else{
    echo "Input contains one or more disallowed characters";
}
// output: Yes, input contains only allowed characters

Шаблон Объяснение:

/          # start pattern
^          # start matching from start of string
[\w +.@-]  # match: a-z, A-Z, 0-9, underscore, space, plus, dot, atsign, hyphen
*          # zero or more occurrences
$          # match until end of string
/          # end pattern

Значимые баллы:

  • Якоря ^ и $ имеют решающее значение для обеспечения проверки всей строки по сравнению только с подстрокой строки.
  • \w (a.k.a. "любой символ слова" -> класс сокращенных символов ) - это простой способ написать: [a-zA-Z0-9_]
  • Символ . точка теряет свое значение "соответствовать чему-либо (почти)" и становится буквальным, когда он записан внутри класса символов. Избегать косой черты не нужно.
  • Дефис внутри класса символов может быть записан без экранирующей косой черты (\-), если он расположен в начале или конце класса символов. Если дефис не находится в начале / конце и он не экранирован, он создаст диапазон символов между символами по обе стороны от него.
    Нравится это или нет, [.-z] не будет соответствовать символу дефиса, потому что он не существует "между" символом точки и строчной буквой z в таблице ascii .
  • *, который следует за классом символов, является " quantifier ". Звездочка означает «0 или более» предыдущего класса символов. В этом случае это означает, что preg_match() позволит пустую строку. Если вы хотите запретить пустую строку, вы можете использовать +, что означает «1 или более» предыдущего класса символов. Наконец, вы можете быть более точным в отношении длины строки, используя число или числа в выражении в фигурных скобках.
    • {8} будет означать, что длина строки должна быть ровно 8 символов.
    • {4,} означает, что длина строки должна быть не менее 4 символов.
    • {,10} будет означать, что длина строки должна быть от 0 до 10.
    • {5,9} будет означать, что длина строки должна быть от 5 до 9 символов.

Если оставить в стороне весь этот совет, если вам абсолютно необходимо использовать ваш массив символов И вы хотите использовать цикл для проверки отдельных символов в соответствии с вашим массивом проверки (и я, конечно, не рекомендую его), то цель должна состоять в том, чтобы уменьшить количество задействованных элементов массива, чтобы уменьшить общее количество итераций.

  • Ваш массив $allowedChars имеет несколько элементов, которые содержат пробел, но необходим только один. Вы должны подготовить массив, используя array_unique() или аналогичный метод.
  • str_split($input) позволит создать массив с дублирующимися элементами. Например, если $input="Test Test Test Test";, то результирующий массив из str_split() будет иметь 19 элементов, 14 из которых потребуют избыточных проверок правильности.
  • Вы могли бы, вероятно, устранить избыточность с str_split(), вызвав count_chars($input,3) и указав его str_split(), или, альтернативно, вы могли бы вызвать str_split(), затем array_unique() перед выполнением итеративного процесса.
1 голос
/ 20 июля 2010

Несколько иной подход:

$allowedChars = array("a","b","c","d","e");
$char_buff = explode('', "Test");
$foundTheseOnes = array_intersect($char_buff, $allowedChars);
if(!empty($foundTheseOnes)) {
    echo 'Yep, something was found. Let\'s find out what: <br />';
    print_r($foundTheseOnes);
}
0 голосов
/ 20 июля 2010

Поскольку вы просто проверяете строку, см. preg_match() и другие функции PCRE для ее обработки.

Кроме того, вы можете использовать strcspn(), чтобы сделать ...


$check = "abcde.... '; // fill in the rest of the characters
$test = "Test";
echo ((strcspn($test, $check) === strlen($test)) ? "Sigh, not found..." : 'Yep, found.');

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...