Определение и удаление невидимых символов из строки в PHP (%E2%80%8E)
У меня есть строки в PHP, которые я читаю из базы данных. Строки-это URL-адреса, и на первый взгляд они выглядят хорошо, но в конце есть какой-то странный символ. В адресной строке браузера строка "%E2%80%8E " добавляется к URL-адресу, который нарушает URL-адрес.
нашел этот пост об удалении метки слева направо из строки в PHP и это, кажется, связано с моей проблемой, но решение не работает для меня, потому что мои герои кажутся что-то еще.
Итак, как я могу определить, какой символ у меня есть, чтобы я мог удалить его из строк?
(Я бы разместил один из URL-адресов здесь в качестве примера, но форма переполнения стека удаляет символ в конце, как только я вставляю его здесь.)
Я знаю, что я мог разрешить только определенные символы в строке и отвергать все остальные. Но я все равно хотел бы знать, что это за символ и как он попадает в базу данных.
EDIT: вопрос был дан ответ, и код, приведенный в принятом ответе, работает для меня:
$str = preg_replace('/p{C}+/u', "", $str);
1 ответов
если вход кодируется utf8, можно использовать регулярное выражение unicode для соответствия / полосы невидимых символов управления, таких как e2808e (слева-направо-знак). Использовать u (PCRE_UTF8)
модификатор и \p{C}
или \p{Other}
.
удалить все невидимые:
$str = preg_replace('/\p{C}+/u', "", $str);
выявление/выявлении невидимые!--18-->:
$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