Регулярное выражение PHP для фильтрации мусора

StackOverflow https://stackoverflow.com/questions/1759746

  •  20-09-2019
  •  | 
  •  

Вопрос

Итак, у меня есть интересная проблема:У меня есть строка, и по большей части я знаю, чего ожидать:

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)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top