在PHP中确定并删除字符串中的不可见字符(%E2%80%8E)

时间:2014-04-17 10:30:43

标签: php regex string character invisible

我在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);

1 个答案:

答案 0 :(得分:13)

如果输入是utf8编码的,可以使用unicode regex来匹配/删除不可见的控制字符,如e2808e(从左到右标记)。使用u (PCRE_UTF8) modifier\p{C}\p{Other}

删除所有不可见的内容

$str = preg_replace('/\p{C}+/u', "", $str);
\p{Other}

Here is a list


检测/识别隐身

$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

Test on eval.in

要识别,请查看Google,例如fileformat.info:

@google:site:fileformat.info e2808e