Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP-仅包含ASCII扩展字符的字符串_Php_Regex - Fatal编程技术网

PHP-仅包含ASCII扩展字符的字符串

PHP-仅包含ASCII扩展字符的字符串,php,regex,Php,Regex,对于PHP,我想知道$string是否包含此列表中33到255之间的任何非ASCII扩展字符: 此外,是否可以包含其他分类的ASCII字符以供拒绝?如182和135(相应的¨和‡符号)。我的意思是,如果$string有这个,我也想得到一个bool false 我知道如何使用ASCII,但不知道如何使用扩展ASCII。扩展ASCII是十进制128-255,普通(7位)ASCII可打印字符是32(空格)到126(平铺) 因此,查找正常可打印范围之外的任何8位字符的正则表达式为: /[^ -~]/

对于PHP,我想知道$string是否包含此列表中33到255之间的任何非ASCII扩展字符:

此外,是否可以包含其他分类的ASCII字符以供拒绝?如182和135(相应的¨和‡符号)。我的意思是,如果$string有这个,我也想得到一个bool false


我知道如何使用ASCII,但不知道如何使用扩展ASCII。

扩展ASCII是十进制128-255,普通(7位)ASCII可打印字符是32(空格)到126(平铺)

因此,查找正常可打印范围之外的任何8位字符的正则表达式为:

/[^ -~]/
基本上,这是说“不是空间通过瓷砖”。在PHP中:

$nonprintable_or_extended = preg_match('/[^ -~]/', $string) === 1;
编辑以添加: 我重新阅读了您的问题,经过再三考虑,我认为您还希望允许使用一些“扩展ASCII”字符。这个问题没有简单的答案,因为代码点127以上的任何内容都涉及字符编码。在美国,我们通常使用以下三种方法之一:

  • ISO-8859-1定义了拉丁语-1,并允许e-grave、e-acute等。 128-255范围内的字符,带有一些空格 ()
  • cp1252(或Windows 代码页1252)基本上是ISO-8859-1,只是增加了更多 129-159范围内的字符,ISO-8859-1未指定 ()
  • UTF-(8,16,32)字符串使用 高阶ASCII字符,用于处理整个系统中的代码点 Unicode频谱(65535及以上),所以要弄清楚“什么是 这里的有效可打印字符?“需要更多考虑
  • 根据下面的注释进行编辑:如果要允许某些字符,请首先对输入编码进行标准化。我们将在UTF-8中操作,我们可以检查并转换cp1252/ISO-8859-1的编码:

    // Validate the UTF-8 (from drupal_validate_utf8()).
    // @see https://api.drupal.org/api/drupal/includes!bootstrap.inc/function/drupal_validate_utf8/7
    if (strlen($string) != 0 && preg_match('/^./us', $string) !== 1) {
      // Convert to UTF-8 if it isn't already (assuming input was "Western" cp1252/ISO).
      $string = @iconv('Windows-1252', 'UTF-8//IGNORE', $string);
    }
    
    现在,
    $string
    保证为有效的UTF-8编码字符串。然后,为了只允许使用单字节“扩展ASCII”(由cp1252提供的拉丁语-1和补充),并以区域设置感知的方式音译类似的ish字符:

    // Ensure the locale is right for our iconv() operations.
    // This establishes how transliteration will determine the appropriate destination character(s).
    setlocale(LC_CTYPE, 'en_US.UTF-8');
    $string = iconv('utf-8', 'CP1252//TRANSLIT//IGNORE', $string);
    
    此时,
    $string
    将是一个cp1252单字节表示字符串;超出该范围的任何内容都将被音译(如果可能)或丢弃。在这里,您可以使用正则表达式应用进一步的筛选,例如:

    // Allow only printable characters (exclude control codes below \x20 [space char]),
    // and only the Euro cp1252 character (\x80) and A-tilde (Ãã) characters (\xC3 and \xE3).
    $filtered_string = preg_replace('[\x20-\x7F\x80\xC3\xE3]+', '', $string);
    

    要检测扩展ASCII字符集,请使用:

    $extended = preg_match('/[\x7f-\xff]/', $str );
    

    编辑:请查看此内容

    来自!到ÿ

    检查ASCII范围33到255中是否有而不是的字符非常容易。只需使用这个正则表达式:

    `[^!-ÿ]`
    
    `[ˆ¶]|[^!-ÿ]`
    
    这是一个否定字符类,它匹配
    之间的任何字符而不是
    ÿ
    。请注意,扩展的ASCII范围取决于机器的区域设置。它应该对你有用

    也不包括
    -

    为了排除这些字符,我们可以将初始的否定类分成三个范围,以便在两个新字符周围留出空间:from
    ˆ
    之前的字符。。。从
    ˆ
    后面的字符到
    ^。。。从
    ^code>后面的字符到
    ÿ

    但是,将这两个字符添加到它们自己的类中,并使用将它们连接在一起,会更简洁(并且更易于维护)。您可以使用此正则表达式:

    `[^!-ÿ]`
    
    `[ˆ¶]|[^!-ÿ]`
    
    • 如果在
      [ˆ¨]
      |
      中找到两个字符中的任何一个,则我们有一个匹配项
    • 如果字符不在
      中-ÿ
      范围

    要添加排除项,只需继续向第一个类中添加字符。

    ASCII
    48
    如何表示
    0
    是非ASCII扩展字符?我刚刚用:做了一个test.php,当我将文件存储为UTF-8(无BOM)时,它起了作用,因为UTF-8是如何工作的。其他任何东西都会遇到Unicode编码问题,因为这些汉字需要多字节编码。请尝试使用欧元符号(虽然是ASCII扩展字符),我仍在收集有关您建议的这两种字符编码的信息。顺便说一句,谢谢你的帮助。如果你想允许一些精心挑选的ISO-8859-1(拉丁语1)或cp1252字符,你必须将它们添加到正则表达式中:$nonprintable_或_extended=preg_match('/[^-~€]/',$string)==1;简单有效的答案;)谢谢ASCII++。。。我需要的任何东西都会被添加答案完全取决于输入编码。因此,我假设它以ISO-8859-1/cp1252(现代浏览器统称为“西方”)的形式出现,我们可以使用单个代码\x80(欧元)、\xC3(大写字母Ã)和\xE3(小写字母ã)。我还将使用preg_replace()编写它,因为ereg_replace()已被弃用$filtered_string=preg_replace(“[\x00-\x7F\x80\xC3\xE3]+”,“$string”)工作正常。对于中文字符,它返回
    true
    ,但对于常规ASCII字符,它返回false。是的,但是欧元符号甚至一个“ã”都没有传递:(你确定你用对了吗?
    返回
    true
    ,没有
    (仅ASCII)返回
    false
    ?是的,您的代码可以很好地用于ASCII,但我需要扩展ASCII;)
    [\x7f-\xff]
    是扩展ASCII的范围仅限所有这些返回相同的:$string='作为\€$da:‰sdFf3Ff3'$字符串='abc'$字符串=‘П€’;echo preg_匹配('/[^!-ÿ]/',''.$string)@杰克。第二个参数为空,它应该是字符串。你把它倒过来了。:)请参阅“工作”是的,很抱歉,我感到困惑,因为我正在尝试将其转换为ereg replace,这样我就可以消除所有非扩展ASCII字符。警告:一旦允许字节值大于126,您就进入了字符编码的世界,因此您首先需要修复输入。通过允许字节值33-255(!-ÿ),您就允许了所有UTF-8,在这一点上,您在限制允许的字符方面实际上没有做任何有用的事情。字节0xFF(255)在ISO-8859-1/etc中仅为ÿ。此微笑:☺ 只是三个字节的“值”?