如何从 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 中的文本字符串中删除隐藏字符?的主要内容,如果未能解决你的问题,请参考以下文章