如何从 PHP 中的文本字符串中删除隐藏字符?

Posted

技术标签:

【中文标题】如何从 PHP 中的文本字符串中删除隐藏字符?【英文标题】:How to remove hidden characters from text string in PHP? 【发布时间】:2016-05-04 16:25:43 【问题描述】:

我很难匹配两个文本字符串。一个包含来自文本字符串的一些隐藏字符。

我有一个文本字符串:“PR & Communications”存储在 SQL 数据库中。当从那里拉到$database_version 时,var_dump($database_version) 显示字符串有 19 个字节。

我已(经许可)从网站上将一些文本抓取到变量 $web_version 中。表面上该字符串是“PR & Communications”,但它与数据库版本不匹配,即if($database_version == $web_version) 不正确。

var_dump() 显示$web_version 有 23 个字节。 trim() 没有效果,strip_tags() 也没有效果,但preg_replace( '/[^\PC\s]/u', $web_version ) 删除了一些东西,因为之后string_var($web_version) 显示字符串仅包含 14 个字节。它显然删除了一些东西,可能太多了,因为字符串仍然与 $database_version 不匹配。

任何想法如何:

    找出已删除的内容 只删除足以匹配 $database_version 的内容?

PS我不知道如何查看十六进制代码中的变量

【问题讨论】:

你试图比较 if( $database_version == $web_version ) 两个变量都是字符串格式吗?尝试一些类型转换和修剪方法。 您可以尝试使用utf8-decode($web_version) - php.net/manual/en/function.utf8-decode.php。 调试:将字符串视为十六进制字节,然后使用var_dump($web_version, bin2hex($web_version), __FILE__.__LINE__);。看看这个字符代表什么:ASCII Table and Description 和 Complete Character List for UTF-8 谢谢 Ryan,您的 var_dump 公式显示,一个值将“&”作为 & 符号,另一个作为 &,因此这两个值不匹配。这帮助我解决了问题。 【参考方案1】:
$v = preg_replace('/\s+|[[:^print:]]/', '', $string);

trim() 只删除“\t\n\r\0\x0B”(参见docs),所以使用上面的 sn-p 从字符串中删除非打印字符。

【讨论】:

这帮助我解决了一个稍微不同的问题。也许您可以澄清非印刷字符以及这个正则表达式的实际作用? [[:print:]] 是 PCRE 打印字符类(复杂正则表达式的别名,更多:php.net/manual/en/regexp.reference.character-classes.php)语法。打印字符意味着在页面渲染上可见。字符类或组中的^ 符号表示否定,因此[[:^print:]] 表示不可打印字符——在页面渲染后不可见的字符(例如 BOM 标记)。正则表达式的其他部分非常简单 - \s 代表“任何空格符号”,(空格、制表符、换行符等),+ 表示“重复一次或多次”,管道(|)表示“或”。 所以,总的来说,它可以读作“查找任何空格符号或不可打印字符”。

以上是关于如何从 PHP 中的文本字符串中删除隐藏字符?的主要内容,如果未能解决你的问题,请参考以下文章

替换隐藏在文本中的字符

php如何从php中的字符串中删除最后一个字符[重复]

从Python中的字符串中删除奇怪的隐藏字符

如何从PHP和Javascript中的字符串中删除所有空格[重复]

如何从 PHP 中的字符串中删除电子邮件地址和链接?

PHP从字符串中删除符号