簡體   English   中英

PHP - 僅限ASCII擴展字符的字符串

[英]PHP - String with ASCII-Extended chars only

使用PHP我想知道我的$ string是否包含此列表中33到255之間的任何非ASCII擴展字符: http//www.ascii-code.com/

此外,是否可以包含其他各種ASCII字符用於拒絕? 像182和135(相應的¶和‡符號)。 我的意思是,如果$ string有這個,我想得到一個bool也是假的。

我知道如何使用ASCII,但不使用ASCII-Extended。

擴展ASCII為十進制128-255,普通(7位)ASCII可打印字符為32(空格)到126(波形符號)。

因此,在正常可打印范圍之外找到任何8位字符的正則表達式將是:

/[^ -~]/

基本上,這說“不是通過代字號”。 在PHP中:

$nonprintable_or_extended = preg_match('/[^ -~]/', $string) === 1;

編輯添加:我重新閱讀你的問題,並且第二個想到我認為你也想要允許一些 “擴展ASCII”字符。 對此沒有簡單的答案,因為代碼點127之上的任何內容都涉及字符編碼 在美國,我們通常使用以下三種中的一種:

  1. ISO-8859-1定義了Latin-1並允許128-255范圍內的e-grave,e-acute等字符,但有一些空白( http://en.wikipedia.org/wiki/Iso_8859-1 ) 。
  2. cp1252(或Windows代碼頁1252)基本上是ISO-8859-1,除了它添加了更多的字符在129-159范圍內,ISO-8859-1未分配( http://en.wikipedia.org/wiki/Cp1252 )。
  3. 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”(拉丁語-1和cp1252提供的補充),並以區域設置感知方式音譯類似字符:

// 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,單字節表示字符串; 超出該范圍的任何內容將被音譯(如果可能)或丟棄。 您可以在此處使用REGEX進一步過濾,例如:

// 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范圍內的字符,33到255非常容易。 只需使用此正則表達式:

`[^!-ÿ]`

這是一個否定的字符類,匹配任何不在之間的字符! ÿ 請注意,擴展的ASCII范圍取決於計算機的區域設置。 它應該適合你。

也不包括

為了排除這些字符,我們可以將最初的否定類分解為三個范圍,以便在兩個新字符周圍留出空間:來自! 該字符前ˆ從字符之后ˆ字符前之后......從性格ÿ

但是將兩個字符添加到自己的類中並使用OR連接它們會更清晰(並且更易於維護)。 你可以使用這個正則表達式:

`[ˆ¶]|[^!-ÿ]`
  • 如果找到[ˆ¶]中的兩個字符中的任何一個,我們有一個匹配,OR |
  • 如果角色不在!-ÿ范圍內。

要添加排除項,只需在第一個類中添加字符即可。

要檢測擴展的ASCII字符集,請使用:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM