正则表达式检查字符串是否包含字母或数字

时间:2014-02-26 22:55:43

标签: php regex string utf

我正在尝试找到检查字符串是否包含任何“怪异”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

谢谢

2 个答案:

答案 0 :(得分:1)

在php中,你可以使用正则表达式使用这些转义来查找具有某些属性的字符:

  

\ p {xx}(含)

     

\ P {xx}(独家)

xx是您正在寻找的特定属性。

以下是属性列表:http://php.net/manual/en/regexp.reference.unicode.php

我认为对于你的情况,你会想要这样的陈述:

  

[\ p {XX} \ p {YY} ..等] +

其中“...... etc”是符号并代表其他属性。这应该匹配您正在寻找的所有字符。

以下是测试正则表达式语句的链接:http://www.phpliveregex.com/

答案 1 :(得分:0)

使用这些方法的多字节版本:

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

虽然我相信这种方法可能完全符合您的要求:http://us1.php.net/manual/en/function.mb-check-encoding.php