如何从PHP字符串中删除类似STX的控制字符?我已经尝试了一些方法
preg_replace("/[^a-zA-Z0-9 .\-_;!:?äÄöÖüÜß<>='\"]/","",$pString)
但我发现它删除了太多内容。是否有一种方法可以仅删除控制字符?
\x7F
(包括回车等!),那么这将起作用:preg_replace('/[\x00-\x1F\x7F]/', '', $input);
\x00
causes a parse error, somehow.)\r
和\n
)可以通过以下方式避免被删除:preg_replace('/[\x00-\x09\x0B\x0C\x0E-\x1F\x7F]/', '', $input);
我必须说,我认为Bobby的答案更好,因为[:cntrl:]
更能传达代码的含义,而不是[\x00-\x1F\x7F]
。
警告:ereg_replace
在PHP >= 5.3.0中已被弃用,并在PHP >= 7.0.0中删除!请使用preg_replace
代替ereg_replace
:
preg_replace('/[[:cntrl:]]/', '', $input);
对于Unicode输入,这将从您的输入文本中删除所有控制字符、未分配、私有使用、格式和代理代码点(如果它们不是空格字符,比如制表符、换行符)。我使用此方法从我的输入中删除所有不可打印字符。
<?php
$clean = preg_replace('/[^\PC\s]/u', '', $input);
了解有关 \p{C}
的更多信息请参见http://www.regular-expressions.info/unicode.html#category。
\PC
而不是\p{C}
? - syl.fabre\PC
的反向形式来匹配控制字符。因此,当\p{C}
匹配控制字符时,\PC
匹配任何不是控制字符的内容。然后,我们使用否定字符类[^..]
来表示匹配/替换任何“不是[不是控制字符或空格]”的内容。因此,这有点像双重否定。 - Scott JungwirthPHP支持POSIX类,因此您可以使用[:cntrl:]
而不是一些花哨的字符魔法:
ereg_replace("[:cntrl:]", "", $pString);
编辑:
在5.3版本中可能需要额外的一对方括号。
ereg_replace("[[:cntrl:]]", "", $pString);
ereg_replace
,因此在 PHP > 7.0 中应该使用 preg_replace("/[[:cntrl:]]/", "", $input);
。 - wowpatrick使用这个正则表达式...
/[^\PCc^\PCn^\PCs]/u
像这样...
$text = preg_replace('/[^\PCc^\PCn^\PCs]/u', '', $text);
^\PCc
: Do not match control characters.^\PCn
: Do not match unassigned characters.^\PCs
: Do not match UTF-8-invalid characters.Simple demo to demonstrate: IDEOne Demo
$text = "\u{0019}hello";
print($text . "\n\n");
$text = preg_replace('/[^\PCc^\PCn^\PCs]/u', '', $text);
print($text);
输出:
(-Broken-Character)hello
hello
^\PC
:仅匹配可见字符。 不匹配任何不可见字符。^\PCc
:仅匹配非控制字符。 不匹配任何控制字符。^\PCc^\PCn
:仅匹配已分配的非控制字符。 不匹配任何控制或未分配字符。^\PCc^\PCn^\PCs
:仅匹配已分配且UTF-8有效的非控制字符。 不匹配任何控制、未分配或UTF-8无效字符。^\PCc^\PCn^\PCs^\PCf
:仅匹配已分配且UTF-8有效的非控制、非格式化字符。 不匹配任何控制、未分配、格式化或UTF-8无效字符。查看可以在正则表达式中使用的Unicode字符属性。 您应该能够在Microsoft .NET、JavaScript、Python、Java、PHP、Ruby、Perl、Golang,甚至Adobe中使用这些正则表达式。 知道Unicode字符类是非常易于转移的知识,因此我建议使用它!
给定其简写和全写形式,此正则表达式将匹配任何可见字符。
\PL\PM\PN\PP\PS\PZ
\PLetter\PMark\PNumber\PPunctuation\PSymbol\PSeparator
\p
表示我们想要匹配的内容,而我们使用\P
(大写)表示不匹配的内容。但是PHP没有这个功能,所以我们需要在正则表达式中使用^
来进行手动否定。^\PC
,但这可能在删除不可见格式时过于严格。您可能需要仔细查看并确定哪种替代方案最适合您的需求。
\PL
或\PLetter
:来自任何语言的任何字母。
\PLl
或\PLowercase_Letter
:具有大写变体的小写字母。\PLu
或\PUppercase_Letter
:具有小写变体的大写字母。\PLt
或\PTitlecase_Letter
:仅当单词的第一个字母大写时,出现在单词开头的字母。\PL&
或\PCased_Letter
:存在小写和大写变体的字母(Ll、Lu和Lt的组合)。\PLm
或\PModifier_Letter
:像字母一样使用的特殊字符。\PLo
或\POther_Letter
:没有小写和大写字母的字母或表意文字\PM
或\PMark
:旨在与另一个字符组合的字符(例如重音符号、umlauts、封闭框等)。
\PMn
或\PNon_Spacing_Mark
:旨在与另一个字符组合而不占用额外空间的字符(例如重音符号、umlauts等)。\PMc
或\PSpacing_Combining_Mark
:旨在与占用额外空间的另一个字符组合的字符(许多东方语言中的元音标志)。\PMe
或\PEnclosing_Mark
:将其与其他字符组合的字符(圆形、正方形、按键等)。\PZ
或\PSeparator
:任何类型的空格或不可见分隔符。
\PZs
或\PSpace_Separator
:不可见的空格字符,但会占用空间。\PZl
或\PLine_Separator
:行分隔符字符U+2028。\PZp
或\PParagraph_Separator
:段落分隔符字符U+2029。\PS
或\PSymbol
:数学符号、货币符号、dingbats、盒式字符等。
\PSm
或\PMath_Symbol
:任何数学符号。\PSc
或\PCurrency_Symbol
:任何货币符号。\PSk
或\PModifier_Symbol
:作为自己的完整字符的组合字符(标记)。\PSo
或\POther_Symbol
:各种不是数学符号、货币符号或组合字符的符号。\PN
或\PNumber
:任何脚本中的任何类型的数字字符。
\PNd
或\PDecimal_Digit_Number
:除表意文字脚本外的任何脚本中的数字零至九。\PNl
或$str = preg_replace(
array(
'/\x00/', '/\x01/', '/\x02/', '/\x03/', '/\x04/',
'/\x05/', '/\x06/', '/\x07/', '/\x08/', '/\x09/', '/\x0A/',
'/\x0B/','/\x0C/','/\x0D/', '/\x0E/', '/\x0F/', '/\x10/', '/\x11/',
'/\x12/','/\x13/','/\x14/','/\x15/', '/\x16/', '/\x17/', '/\x18/',
'/\x19/','/\x1A/','/\x1B/','/\x1C/','/\x1D/', '/\x1E/', '/\x1F/'
),
array(
"\u0000", "\u0001", "\u0002", "\u0003", "\u0004",
"\u0005", "\u0006", "\u0007", "\u0008", "\u0009", "\u000A",
"\u000B", "\u000C", "\u000D", "\u000E", "\u000F", "\u0010", "\u0011",
"\u0012", "\u0013", "\u0014", "\u0015", "\u0016", "\u0017", "\u0018",
"\u0019", "\u001A", "\u001B", "\u001C", "\u001D", "\u001E", "\u001F"
),
$str
);
如果您只想过滤掉我熟悉的控制字符(即32和127以下的字符),请尝试以下方法:
for($control = 0; $control < 32; $control++) {
$pString = str_replace(chr($control), "", $pString;
}
$pString = str_replace(chr(127), "", $pString;
循环将除DEL之外的所有内容都删除,然后我们只需将其添加到末尾。
我认为这比处理正则表达式和正则表达式库要轻松得多。
仅仅是为了好玩,我想出了另一种方法来实现它。这个方法使用一个控制字符数组:
$ctrls = range(chr(0), chr(31));
$ctrls[] = chr(127);
$clean_string = str_replace($ctrls, "", $string);