source

문자열에서 인쇄할 수 없는 문자를 모두 제거하려면 어떻게 해야 합니까?

factcode 2022. 9. 28. 00:04
반응형

문자열에서 인쇄할 수 없는 문자를 모두 제거하려면 어떻게 해야 합니까?

0-31과 127의 문자를 삭제해야 할 것 같습니다.

이를 효율적으로 수행하기 위한 기능 또는 코드가 있습니까?

7비트 ASCII?

1963년에 타디스가 도착했는데 인쇄 가능한 7비트 ASCII 문자만 원하는 경우 0-31과 127-255를 모두 삭제할 수 있습니다.

$string = preg_replace('/[\x00-\x1F\x7F-\xFF]/', '', $string);

0 ~ 31, 127 ~255 범위의 임의의 것과 일치하여 삭제합니다.

8비트 확장 ASCII?

뜨거운 욕조 타임머신에 빠져서 80년대에 들어왔어8비트의 ASCII 형식을 사용하고 있는 경우는, 128~255 의 범위에서 문자를 사용할 수 있습니다.간단한 조정 - 0-31 및 127만 선택 가능

$string = preg_replace('/[\x00-\x1F\x7F]/', '', $string);

UTF-8?

것을 합니다.스트링이 UTF-8은 UTF-8을 합니다./u 정규식에서는 수식자를 사용할 수 있습니다.

$string = preg_replace('/[\x00-\x1F\x7F]/u', '', $string);

그러면 0-31과 127이 제거됩니다.ASCII 및 UTF-8에서는 양쪽이 같은 제어 세트 범위를 공유하기 때문에(아래의 mgutt에 기재되어 있습니다).엄밀히 말하면, 이 작업은,/u를 제거하고 ...하지만 다른 문자를 제거하고 싶다면 그게 삶을 더 편하게 해줄거야

Unicode를 사용하고 있는 경우는, 인쇄되지 않는 요소가 많을 가능성이 있습니다만, 간단하게 생각해 봅시다.NO-BREAK SPACE (U+00A0)

에서는 UTF-8로 됩니다.0xC2A0.할 수 , " " 를 하여" 를 사용할 수 있습니다/u.\xA0「이것들」은 다음과 같습니다.

$string = preg_replace('/[\x00-\x1F\x7F\xA0]/u', '', $string);

부록:str_replace는 어떻습니까?

preg_replace는 매우 효율적이지만 이 작업을 많이 수행할 경우 삭제할 문자 배열을 작성하고 아래 mgutt에서 설명한 바와 같이 str_replace를 사용할 수 있습니다.

//build an array we can re-use across several operations
$badchar=array(
    // control characters
    chr(0), chr(1), chr(2), chr(3), chr(4), chr(5), chr(6), chr(7), chr(8), chr(9), chr(10),
    chr(11), chr(12), chr(13), chr(14), chr(15), chr(16), chr(17), chr(18), chr(19), chr(20),
    chr(21), chr(22), chr(23), chr(24), chr(25), chr(26), chr(27), chr(28), chr(29), chr(30),
    chr(31),
    // non-printing characters
    chr(127)
);

//replace the unwanted chars
$str2 = str_replace($badchar, '', $str);

직관적으로 보면 빠른 것 같지만 항상 그런 것은 아닙니다.벤치마크를 사용하여 절약되는 것이 있는지 확인해야 합니다.랜덤 데이터로 다양한 문자열 길이에 걸쳐 벤치마크를 실시했는데, 이 패턴이 php 7.0.12를 사용하여 나타났습니다.

     2 chars str_replace     5.3439ms preg_replace     2.9919ms preg_replace is 44.01% faster
     4 chars str_replace     6.0701ms preg_replace     1.4119ms preg_replace is 76.74% faster
     8 chars str_replace     5.8119ms preg_replace     2.0721ms preg_replace is 64.35% faster
    16 chars str_replace     6.0401ms preg_replace     2.1980ms preg_replace is 63.61% faster
    32 chars str_replace     6.0320ms preg_replace     2.6770ms preg_replace is 55.62% faster
    64 chars str_replace     7.4198ms preg_replace     4.4160ms preg_replace is 40.48% faster
   128 chars str_replace    12.7239ms preg_replace     7.5412ms preg_replace is 40.73% faster
   256 chars str_replace    19.8820ms preg_replace    17.1330ms preg_replace is 13.83% faster
   512 chars str_replace    34.3399ms preg_replace    34.0221ms preg_replace is  0.93% faster
  1024 chars str_replace    57.1141ms preg_replace    67.0300ms str_replace  is 14.79% faster
  2048 chars str_replace    94.7111ms preg_replace   123.3189ms str_replace  is 23.20% faster
  4096 chars str_replace   227.7029ms preg_replace   258.3771ms str_replace  is 11.87% faster
  8192 chars str_replace   506.3410ms preg_replace   555.6269ms str_replace  is  8.87% faster
 16384 chars str_replace  1116.8811ms preg_replace  1098.0589ms preg_replace is  1.69% faster
 32768 chars str_replace  2299.3128ms preg_replace  2222.8632ms preg_replace is  3.32% faster

타이밍 자체는 10,000회 반복이지만, 더 흥미로운 것은 상대적인 차이입니다.512자까지 preg_replace가 항상 우승하는 것을 보았습니다.1~8kb 범위에서 str_replace의 에지는 한계입니다.

흥미로운 결과라고 생각했기 때문에, 여기에 포함시켜 주세요.중요한 것은 이 결과를 사용하여 어떤 방법을 사용할지 결정하는 것이 아니라 자신의 데이터에 대해 벤치마킹한 후 결정하는 것입니다.

Many of the other answers here do not take into account unicode characters (e.g. öäüßйȝîûηыეமிᚉ⠛ ).이 경우 다음을 사용할 수 있습니다.

$string = preg_replace('/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x9F]/u', '', $string);

범위에 이상한 가 있습니다.\x80-\x9F의 ASCII 범위 으로 제어 문자이지만 이 지남에 따라 한 문자에 7비트의 ASCII는 ASCII를 사용).이러한 기능에 문제가 없는 경우는, 다음의 조작을 실시할 수 있습니다.

$string = preg_replace('/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/u', '', $string);

줄 바꿈, 캐리지 리턴, 탭, 중단 없는 공간 및 소프트 하이픈도 삭제할 수 있습니다.

$string = preg_replace('/[\x00-\x1F\x7F-\xA0\xAD]/u', '', $string);

의 예에서는 작은 따옴표를 사용해야 합니다.

인쇄 가능한 기본 ASCII 문자(위의 모든 예제 문자가 제거됨)를 제외한 모든 문자를 삭제할 경우 다음을 사용할 수 있습니다.

$string = preg_replace( '/[^[:print:]]/', '',$string);

자세한 것은, http://www.fileformat.info/info/charset/UTF-8/list.htm 를 참조해 주세요.

PHP 5.2부터는 filter_var에도 액세스 할 수 있게 되었습니다.이것에 대해서는, 지금까지 언급한 적이 없습니다.filter_var를 사용하여 인쇄 불가능한 문자< 32 및 > 127을 삭제하려면 다음 작업을 수행합니다.

32자 미만의 ASCII 문자 필터링

$string = filter_var($input, FILTER_UNSAFE_RAW, FILTER_FLAG_STRIP_LOW);

127 이상의 ASCII 문자 필터링

$string = filter_var($input, FILTER_UNSAFE_RAW, FILTER_FLAG_STRIP_HIGH);

둘 다 제거:

$string = filter_var($input, FILTER_UNSAFE_RAW, FILTER_FLAG_STRIP_LOW|FILTER_FLAG_STRIP_HIGH);

html-encode는 high를 제거하면서 낮은 문자(newline, tab 등)를 지정할 수도 있습니다.

$string = filter_var($input, FILTER_UNSAFE_RAW, FILTER_FLAG_ENCODE_LOW|FILTER_FLAG_STRIP_HIGH);

HTML 삭제, 전자 메일 및 URL 삭제 등의 옵션도 있습니다.즉, 데이터 삭제(데이터 삭제) 및 검증(사일런트 제거가 아닌 유효하지 않은 경우 false 반환)을 위한 많은 옵션이 있습니다.

삭제: http://php.net/manual/en/filter.filters.sanitize.php

검증: http://php.net/manual/en/filter.filters.validate.php

단, FILTER_FLAG_STRIP_LOW가 줄바꿈과 캐리지 리턴(텍스트 영역에서는 완전히 유효한 문자)을 삭제하는 문제가 있습니다.따라서 Regex의 답변 중 일부는 여전히 필요할 수 있습니다. 예를 들어 이 스레드를 검토한 후 텍스트 영역에 대해 이 작업을 수행할 계획입니다.

$string = preg_replace( '/[^[:print:]\r\n]/', '',$input);

이는 숫자 범위로 삭제된 다수의 정규식보다 읽기 쉬워 보입니다.

문자 클래스를 사용할 수 있습니다.

/[[:cntrl:]]+/

모든 솔루션이 부분적으로 기능하며, 아래에서도 모든 경우를 대상으로 하는 것은 아닙니다.문제는 utf8 mysql 테이블에 문자열을 삽입하는 것이었습니다.문자열(및 그 바이트)은 모두 utf8에 준거하고 있습니다만, 몇개의 부정한 시퀀스가 있습니다.나는 그들 대부분이 통제나 형식이었다고 생각한다.

function clean_string($string) {
  $s = trim($string);
  $s = iconv("UTF-8", "UTF-8//IGNORE", $s); // drop all non utf-8 characters

  // this is some bad utf-8 byte sequence that makes mysql complain - control and formatting i think
  $s = preg_replace('/(?>[\x00-\x1F]|\xC2[\x80-\x9F]|\xE2[\x80-\x8F]{2}|\xE2\x80[\xA4-\xA8]|\xE2\x81[\x9F-\xAF])/', ' ', $s);

  $s = preg_replace('/\s+/', ' ', $s); // reduce all multiple whitespace to a single space

  return $s;
}

이 문제를 더욱 악화시키는 것은, 여기서 조금 설명한 바와 같이, 컨텐츠의 테이블 대 서버 대 접속 대 렌더링입니다.

이 방법은 간단합니다.

$string = preg_replace (/[^[:cntrl:]]/', '', $string);

비 ASC를 모두 삭제하려면입력 문자열의 II 문자

$result = preg_replace('/[\x00-\x1F\x80-\xFF]/', '', $string);

이 코드에서는 16진수 범위 0~31 및 128~255의 문자는 모두 삭제되고 결과 문자열에는 32~127의 16진수 문자만 남습니다.이 예에서는 $result라고 부릅니다.

UTF-8 의 경우는, 다음과 같이 시험해 주세요.

preg_replace('/[^\p{L}\s]/u','', $string);

10년 전 저의 답변서입니다.댓글에 의하면 []!~]와 같이 텍스트 이외의 문자를 삭제하기 때문에 풀 텍스트 검색 엔진에 매우 적합하다고 합니다.

들어 비활성 가 있는 , "" " " " " " " " 를 입력합니다.libexpat(예: ), 다음의 조작을 실시합니다.

preg_replace('/[^\PCc^\PCn^\PCs]/u', '', $string);

방법에 대한 자세한 내용은 이 답변을 참조하십시오.

일반 익스프레스를 사용하여 유지하고 싶은 문자를 제외한 모든 문자를 삭제할 수 있습니다.

$string=preg_replace('/[^A-Za-z0-9 _\-\+\&]/','',$string);

(^) 문자 A~Z 또는 a~z, 숫자 0~9, 공백, 언더스코어, 하이픈, 플러스 및 앰퍼샌드가 아닌 모든 문자를 아무것도 아닌 것으로 바꿉니다(즉, 삭제).

preg_replace('/(?!\n)[\p{Cc}]/', '', $response);

그러면 모든 제어 문자가 삭제됩니다(http://uk.php.net/manual/en/regexp.reference.unicode.php)는\n문제를 지금까지의 경험으로 볼 때, 인쇄상의 문제를 일으키는 것은 컨트롤 문자입니다.

@PaulDixon의 답변 완전히 틀렸다. 왜냐하면 인쇄 가능 파일을 삭제합니다.확장 ASCII 문자 128 ~255! 가 부분적으로 수정되었습니다.확장 ASCII 문자가 없는 127자 7비트 ASCII 세트에서 128-255를 삭제하려는 이유를 모르겠습니다.

는 삭제하지 않는 것이 128-255는 삭제하지 않습니다.chr(128) )\x80)는 8비트 ASCII의 유로 기호로, Windows의 많은 UTF-8 글꼴에는 유로 기호와 Android가 표시되어 있습니다.

또한 UTF-8 문자열(아마 멀티바이트 UTF-8 문자의 시작 바이트)에서 ASCII 문자 128-255를 삭제하면 많은 UTF-8 문자가 삭제됩니다.그러니 그러지 마세요!현재 사용되는 모든 파일 시스템에서 완전히 합법적인 문자입니다.유일한 예약 범위는 0 ~31 입니다

대신 인쇄 불가능한 문자 0~31 및 127을 삭제하려면 다음과 같이 하십시오.

$string = preg_replace('/[\x00-\x1F\x7F]/', '', $string);

ASCIIUTF-8에서는 모두 동일한 제어 세트 범위를 공유하기 때문에 동작합니다.

가장 빠른 정규 표현을 사용하지 않는 저속 대체 방법:

$string = str_replace(array(
    // control characters
    chr(0), chr(1), chr(2), chr(3), chr(4), chr(5), chr(6), chr(7), chr(8), chr(9), chr(10),
    chr(11), chr(12), chr(13), chr(14), chr(15), chr(16), chr(17), chr(18), chr(19), chr(20),
    chr(21), chr(22), chr(23), chr(24), chr(25), chr(26), chr(27), chr(28), chr(29), chr(30),
    chr(31),
    // non-printing characters
    chr(127)
), '', $string);

모든 공백 문자를 유지하려면\t,\n그리고.\r, 그 후 삭제하다chr(9),chr(10)그리고.chr(13)이 리스트로부터.주의: 보통 공백은 다음과 같습니다.chr(32)결과에 남습니다.중단 없는 공간을 제거할 것인지 결정합니다.chr(160)문제를 일으킬 수 있기 때문에

§ @PaulDixon에 의해 테스트되어 스스로 검증되었습니다.

Unicode: 0x1d(php 7.4 사용)에 대해 선택한 응답에 대한 regex가 실패함

해결 방법:

<?php
        $ct = 'différents'."\r\n test";

        // fail for Unicode: 0x1d
        $ct = preg_replace('/[\x00-\x1F\x7F]$/u', '',$ct);

        // work for Unicode: 0x1d
        $ct =  preg_replace( '/[^\P{C}]+/u', "",  $ct);

        // work for Unicode: 0x1d and allow line break
        $ct =  preg_replace( '/[^\P{C}\n]+/u', "",  $ct);

        echo $ct;

from: UTF 8 String은 줄바꿈을 제외한 보이지 않는 모든 문자를 삭제합니다.

어때?

return preg_replace("/[^a-zA-Z0-9`_.,;@#%~'\"\+\*\?\[\^\]\$\(\)\{\}\=\!\<\>\|\:\-\s\\\\]+/", "", $data);

포함시키고 싶은 것을 완전히 제어할 수 있습니다.

인쇄할 수 없는 문자를 제거하지 않고, 오히려 탈옥하는 방법을 찾고 있는 분들을 위해 이것을 만들었습니다.얼마든지 개선해 주세요!문자는 \x[A-F0-9][A-F0-9]로 이스케이프됩니다.

다음과 같이 호출합니다.

$escaped = EscapeNonASCII($string);

$unescaped = UnescapeNonASCII($string);

<?php 
  function EscapeNonASCII($string) //Convert string to hex, replace non-printable chars with escaped hex
    {
        $hexbytes = strtoupper(bin2hex($string));
        $i = 0;
        while ($i < strlen($hexbytes))
        {
            $hexpair = substr($hexbytes, $i, 2);
            $decimal = hexdec($hexpair);
            if ($decimal < 32 || $decimal > 126)
            {
                $top = substr($hexbytes, 0, $i);
                $escaped = EscapeHex($hexpair);
                $bottom = substr($hexbytes, $i + 2);
                $hexbytes = $top . $escaped . $bottom;
                $i += 8;
            }
            $i += 2;
        }
        $string = hex2bin($hexbytes);
        return $string;
    }
    function EscapeHex($string) //Helper function for EscapeNonASCII()
    {
        $x = "5C5C78"; //\x
        $topnibble = bin2hex($string[0]); //Convert top nibble to hex
        $bottomnibble = bin2hex($string[1]); //Convert bottom nibble to hex
        $escaped = $x . $topnibble . $bottomnibble; //Concatenate escape sequence "\x" with top and bottom nibble
        return $escaped;
    }

    function UnescapeNonASCII($string) //Convert string to hex, replace escaped hex with actual hex.
    {
        $stringtohex = bin2hex($string);
        $stringtohex = preg_replace_callback('/5c5c78([a-fA-F0-9]{4})/', function ($m) { 
            return hex2bin($m[1]);
        }, $stringtohex);
        return hex2bin(strtoupper($stringtohex));
    }
?>

마킹된 anwser는 완벽하지만 인쇄 불가능한 문자 127(DEL)이 누락됨

제 대답은

$string = preg_replace('/[\x00-\x1F\x7f-\xFF]/', '', $string);

"cedivad"는 스웨덴 chars äö의 끈질긴 결과로 문제를 해결했습니다.

$text = preg_replace( '/[^\p{L}\s]/u', '', $text );

감사합니다!

https://github.com/neitanod/forceutf8을 사용하여 UTF8 문제를 해결했습니다.

use ForceUTF8\Encoding;

$string = Encoding::fixUTF8($string);

언급URL : https://stackoverflow.com/questions/1176904/how-to-remove-all-non-printable-characters-in-a-string

반응형