2009-11-18 4 views
0

Поэтому у меня есть интересная проблема: У меня есть строка, и по большей части я знаю, чего ожидать:PHP регулярного выражения для фильтрации нежелательной

http://www.someurl.com/st= ????????

За исключением этого случая, символы «s» - это буквы или цифры в верхнем регистре. Проблема состоит в том, что в строку помещается мусор: строка разбивается на 5 или 6 штук, а между ними много мусора: непечатаемые символы, инородные символы, а также простые старые обычные символы. Короче говоря, все, что может выглядеть так: Nyþ = mî; ëMÝ × nüqÏ

Обычно последние 8 символов (?) Находятся вместе в конце, поэтому на данный момент у меня есть PHP, последние 8 символов и надежду на лучшее. Иногда это не работает, поэтому мне нужно более надежное решение.

Проблема технически неразрешима, но я считаю, что лучшим решением является захват символов из конца строки, когда они являются верхними или числовыми. Если я получаю 8 или более, предположим, что это правильно. В противном случае найдите символы st = и grab, идущие вперед, сколько мне нужно, чтобы заполнить 8-символьную квоту. Есть ли способ регулярных выражений, чтобы сделать это, или мне нужно свернуть рукава и пойти в стиле вложенной петли?

обновление:

Чтобы прояснить некоторую путаницу, я получаю строку ввода, как это:

[garbage]http:/[garbage]/somewe[garbage]bsite.co[garbage]m/something=[garbage]???????? 

кроме мусора в непредсказуемых местах в строке (за исключением конец никогда не мусор), и имеет непредсказуемую длину (по крайней мере, я не смог найти шаблоны ни в одном). Обычно это все вместе, поэтому я просто хватаю последние 8 символов, но иногда они не приводят к некоторым недостающим данным и возвращают мусор: - \

+0

Что вы имеете в виду: «Обычно последние 8 символов («? ») находятся вместе в конце»? – Franz

+1

Могу ли я спросить, почему и как вы попали в такую ​​проблемную ситуацию? Кто поставил там «мусор» и почему? –

ответ

6
$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); 
+0

Как насчет других персонажей, таких как двоеточия или косые черты? – Aistina

+0

Ах, сообщение отредактировано. Я скоро уточню. – Dereleased

+0

Спасибо! Я не совсем уверен, что делает это регулярное выражение, но вывод примерного ввода - 4Z56M9NQ9GP215, длина которого превышает 8 символов, поскольку мусор может содержать все эти символы. В основном мне нужно отбросить что-нибудь между [мусором] после того, как (надеюсь) последний знак = = – Mala

0

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

+0

Я в основном получаю строку с мусором, смешанным в непредсказуемые промежутки времени, и я хочу вернуть исходную строку.Я не думаю, что bin2hex() поможет мне с этим – Mala

1

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

__http:/____/somewe___bsite.co____m/something=__ABCDEFGHI__ 
+0

это неразрешимо верно, но наилучшее приближение - это нечто вроде: собирать со спины, насколько это выглядит разумно; собирать из «что-то» вперед, если смотреть разумно; если первая часть> = 8 символов использует это, в противном случае возьмите столько же из второй части, сколько необходимо, чтобы заполнить ее до 8 символов – Mala

+0

+1, хорошая точка. Но, с другой стороны, двусмысленные случаи, вероятно, находятся в меньшинстве. Если вы можете определить правильный URL-адрес в 90% случаев, это все равно может стоить того. –

+0

это «как можно разумнее», что у меня возникают проблемы с – Mala

0

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

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

+1

Не могли бы вы подробнее рассказать о своем ответе, добавив немного больше подробностей о решении, которое вы предоставляете? – abarisone