Регулярное выражение, чтобы проверить, содержит ли строка буквы или цифры

Я пытаюсь найти лучший способ проверить, есть ли в строке какие-либо «странные» символы UTF-8.

В основном я ищу что-то, что защитило бы от всех различных управляющих символов UTF 8, отличных от пробелов, которые могут быть скрыты в строке. Когда я говорю «скрытый», я имею в виду, что вывод строки на экран не будет отображать эти символы. Они будут либо пробелами, либо пустыми символами.

Мой предыдущий подход к решению этой проблемы заключался в том, чтобы вернуть true, если строка является одним из этих символов:

  function isUnusualString($string) {
    if($string == "")
      return TRUE;

      $char = ord($string);

      if($char < 33)
        return TRUE;
      if($char > 8191 && $char < 8208)
        return TRUE;
      if($char > 8231 && $char < 8240)
        return TRUE;

      switch($char) {
        case 160:    // Non-Breaking Space
        case 8287:    // Medium Mathematical Space
          return TRUE;
          break;
      }
    return FALSE;
  }

Однако это не охватывает все случаи, и я не знаю, почему. Я предполагаю, что некоторые из этих символов могут быть больше длины 1 или длины 0?.

Итак, затем я попытался перебрать символы строки и проверить, содержит ли строка какой-либо из «скрытых» символов.

Например, запуск следующего кода:

        function isUnusualUTF($string) {
      if($string == "")
        return TRUE;

   $strlen = strlen($string);

  for ($i = 0; $i < $strlen; ++$i) {
    $char = ord($string[$i]);

     if($char < 33)
       echo "char = ".$char." at index: ".$i." is < 33";


     if($char > 8191 && $char < 8208)
       echo "char = ".$char." at index: ".$i." is >8191 and < 8240 ";


     if($char > 8231 && $char < 8240)
       echo "char = ".$char." at index: ".$i." is > 8231 and < 8240 ";


     switch($char) {
     case 160:    // Non-Breaking Space
     case 8287:    // Medium Mathematical Space
       echo "cases<br>"; //return TRUE;
       break;
     }
   }
     return FALSE;
}

$string = "Unicode ";
echo isUnusualUTF($string);

Выходы:

char = 32 at index: 7 is < 33

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

if string has (numbers or letters or " " or other symbols 
               that can be printed and seen in the screen)
  return true
else
  return false

Спасибо


person Don Code    schedule 26.02.2014    source источник
comment
Вы пробовали перебирать персонажей?   -  person Dave Chen    schedule 27.02.2014
comment
Будут ли работать только символы ASCII?   -  person Mike    schedule 27.02.2014
comment
@DaveChen Я только что отредактировал пост, включив в него свой второй подход.   -  person Don Code    schedule 27.02.2014


Ответы (2)


В php вы можете использовать регулярное выражение для поиска символов с определенными свойствами, используя эти escape-последовательности:

\p{xx} (включительно)

\P{xx} (эксклюзивный)

Где xx — это определенное свойство, которое вы ищете.

Вот список свойств: http://php.net/manual/en/regexp.reference.unicode.php

Я думаю, что для вашего случая вы хотели бы создать такое утверждение:

[\P{xx}\P{yy}..etc]+

где ...etc является символическим и представляет дополнительные свойства. Это должно соответствовать всем символам, которые вы ищете.

Вот ссылка для проверки оператора регулярного выражения: http://www.phpliveregex.com/

person Gi0rgi0s    schedule 27.02.2014
comment
Да, регулярное выражение, безусловно, правильное направление. Кстати, мне интересно, не было бы уже существующего решения для такого рода фильтрации... - person inf3rno; 27.02.2014

Используйте многобайтовые версии этих методов:

mb_strlen: http://us1.php.net/mb_strlen

Хотя я считаю, что этот метод может делать именно то, что вы хотите: http://us1.php.net/manual/en/function.mb-check-encoding.php

person Joe Frambach    schedule 26.02.2014