PHP регулярное выражение для фильтрации мусора - PullRequest
0 голосов
/ 19 ноября 2009

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

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 символов, но иногда это не так, что приводит к отсутствующим данным и возвращает мусор: - \

Ответы [ 4 ]

6 голосов
/ 19 ноября 2009
$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);
1 голос
/ 19 ноября 2009

Как указано, проблема неразрешима. Если мусор может содержать символы «простые старые нормальные символы», и мусор может находиться в конце строки, то вы не можете знать, является ли целевая строка из этого образца «ABCDEFGH» или «BCDEFGHI»:

__http:/____/somewe___bsite.co____m/something=__ABCDEFGHI__
0 голосов
/ 13 мая 2015

Вы можете использовать это регулярное выражение:

if (preg_match ('/ [\' ^ £ $% & * ()} {@ # ~?> <>, | = _ + ¬ -] / ', $ string) == 1)

0 голосов
/ 19 ноября 2009

Что представляют собой эти значения? Если вы хотите сохранить все это, просто не имея дело с мусором в вашей базе данных, возможно, вам следует закодировать его в шестнадцатеричном формате, используя bin2hex () .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...