Регулярное выражение PHP для фильтрации мусора
Вопрос
Итак, у меня есть интересная проблема:У меня есть строка, и по большей части я знаю, чего ожидать:
http://www.someurl.com/st=????????
За исключением этого случая, символы ? — это либо прописные буквы, либо цифры.Проблема в том, что в строке смешанный мусор:строка разбита на 5 или 6 частей, а между ними много мусора:непечатаемые символы, иностранные символы, а также старые добрые нормальные символы.Короче говоря, все это может выглядеть так:Nyþ=mî;ëMÝ×nüqÏ
Обычно последние 8 символов (?) находятся вместе в самом конце, поэтому на данный момент я просто использую PHP, чтобы захватить последние 8 символов и надеяться на лучшее.Иногда это не работает, поэтому мне нужно более надежное решение.
Проблема технически неразрешима, но я думаю, что лучшее решение — захватывать символы с конца строки, когда они имеют верхний регистр или число.Если я получу 8 или больше, считайте, что это правильно.В противном случае найдите st= и захватите столько символов, сколько мне нужно, чтобы заполнить квоту в 8 символов.Есть ли способ сделать это с помощью регулярного выражения, или мне нужно будет засучить рукава и использовать стиль вложенного цикла?
обновлять:
Чтобы прояснить некоторую путаницу, я получаю следующую входную строку:
[garbage]http:/[garbage]/somewe[garbage]bsite.co[garbage]m/something=[garbage]????????
за исключением того, что мусор находится в непредсказуемых местах строки (за исключением того, что конец никогда не является мусором) и имеет непредсказуемую длину (по крайней мере, мне удалось найти шаблоны ни в одном из них).Обычно ? все вместе, поэтому я просто беру последние 8 символов, но иногда это не так, что приводит к отсутствию некоторых данных и возврату мусора :-\
Решение
$var = '†http://þ=www.ex;üßample-website.î;ëcomÝ×ü/joy_hÏere.html'; // test case
$clean = join(
array_filter(
str_split($var, 1),
function ($char) {
return (
array_key_exists(
$char,
array_flip(array_merge(
range('A','Z'),
range('a','z'),
range((string)'0',(string)'9'),
array(':','.','/','-','_')
))
)
);
}
)
);
Ха, это была шутка.Вот регулярное выражение для вас:
$clean = preg_replace('/[^A-Za-z0-9:.\/_-]/','',$var);
Другие советы
Как говорится, проблема неразрешима.Если мусор может содержать символы «простых старых обычных символов» и мусор может попасть в конец строки, то вы не сможете узнать, является ли целевая строка из этого примера «ABCDEFGH» или «BCDEFGHI»:
__http:/____/somewe___bsite.co____m/something=__ABCDEFGHI__
Что представляют собой эти ценности?Если вы хотите сохранить все это, без необходимости иметь дело с мусором в вашей базе данных, возможно, вам следует закодировать его в шестнадцатеричном формате, используя бин2гекс().
Вы можете использовать это регулярное выражение:
if (preg_match('/[\'^£$%&*()}{@#~?><>,|=_+¬-]/', $string) ==1)