我在PHP中有字符串,我从数据库中读取。字符串是URL,乍一看它们看起来很好,但最后似乎有一些奇怪的字符。在浏览器的地址栏中,字符串为'%E2%80%8E'被附加到URL,这会破坏URL。
我找到this post on stripping the left-to-right-mark from a string in PHP,这似乎与我的问题有关,但解决方案对我不起作用,因为我的角色似乎是别的。
那么如何确定我拥有哪个角色,以便将其从字符串中删除?
(我会在这里发布一个URL作为示例,但是一旦我将它粘贴到这里,堆栈溢出形式就会在最后删除该字符。)
我知道我只能在字符串中允许某些字符并丢弃所有其他字符。但我仍然想知道它是什么字符 - 以及它如何进入数据库。
编辑:问题已得到解答,接受的答案中给出的代码对我有用:
$str = preg_replace('/\p{C}+/u', "", $str);
答案 0 :(得分:13)
如果输入是utf8编码的,可以使用unicode regex来匹配/删除不可见的控制字符,如e2808e(从左到右标记)。使用u (PCRE_UTF8)
modifier和\p{C}
或\p{Other}
。
删除所有不可见的内容:
$str = preg_replace('/\p{C}+/u', "", $str);
\p{Other}
的检测/识别隐身:
$str = ".\xE2\x80\x8E.\xE2\x80\x8B.\xE2\x80\x8F";
// get invisibles + offset
if(preg_match_all('/\p{C}/u', $str, $out, PREG_OFFSET_CAPTURE))
{
echo "<pre>\n";
foreach($out[0] AS $k => $v) {
echo "detected ".bin2hex($v[0])." @ offset ".$v[1]."\n";
}
echo "</pre>";
}
输出:
detected e2808e @ offset 1
detected e2808b @ offset 5
detected e2808f @ offset 9
要识别,请查看Google,例如fileformat.info:
@google:site:fileformat.info e2808e