Определение и удаление невидимых символов из строки в 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);

здесь of \p{Other}


выявление/выявлении невидимые!--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

тест на eval.в

чтобы определить, посмотрите на Google, например fileformat.info:

@google:site:fileformat.info e2808e