2012-02-11 2 views
1

У меня есть запрос в php-строке, которую я пытаюсь отфильтровать от знаков%. Все дело в utf-8. Если строка содержит% (например,% acheron), она преобразуется в ее эквивалентную сущность (в случае, если я упоминаю, что она становится символом символа «не», который интерпретируется последовательностью% ac в строке). Я не могу очистить входящую строку этого символа/ Я не могу очистить строку с заменой php, потому что к тому моменту, когда она в скрипте уже «расшифрована?».PHP чистая входящая строка с знаком%

Единственный способ, которым я смог найти, это использовать rawurlencode, а затем очистить его, но это похоже на дерьмовое решение, и это создает проблемы с другими персонажами для меня.

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

Другими словами, есть способ принять строку и очистить ее без каких-либо потенциально специальных символов, преобразованных, чтобы я мог их удалить из строки.

EDIT: запрос поступает через GET, неясно. EDIT2: с кодом urlecode или rawurl: % acheron преобразуется в% ACheron (который можно было очистить, я думаю), но ^ acheron преобразуется в% 5Eacheron (таким образом, почти невозможно очистить его с помощью шаблона) ...

Пожалуйста, простите noobishness мой вопрос спасибо Ларри

+0

Пробовал работает urldecode() на ней первым? –

+0

Я попытался использовать его как rawurlencode, но если я использую либо он возвращается как% ACheron, но и с той же функцией, если входной файл^Acheron преобразуется в% 5Eacheron – Larry

+0

Какой браузер вы используете, который преобразует% ac в^A во время подачи формы? –

ответ

1

$ строка = preg_replace ("/ (% | & | #) /", '', $ строка);

Что-то вроде этого? Это должно сработать, если я понял вашу проблему.

EDIT: Хорошо, это то, что вы ищете:

<?php 
function myUrlEncode($string) { 
    $entities = array('%21', '%2A', '%27', '%28', '%29', '%3B', '%3A', '%40', '%26', '%3D', '%2B', '%24', '%2C', '%2F', '%3F', '%25', '%23', '%5B', '%5D', '%5E'); 
    $replacements = array('!', '*', "'", "(", ")", ";", ":", "@", "&", "=", "+", "$", ",", "/", "?", "%", "#", "[", "]", "^"); 
    return str_replace($entities, $replacements, urlencode($string)); 
} 


$search = myUrlEncode($_GET['id']); 
$search = preg_replace("/(%|&|#)/", '', $search); 

echo $search; 
?> 
+0

Это работает, но следите за местными жителями, которые голосуют за любое использование регулярных выражений для замены легкого текста. –

+0

Привет, спасибо, но он не будет работать, так как это вводится из веб-формы и к тому времени, когда он дойдет до скрипта, он уже закодировал/расшифровал% ac (в данном случае) до знака «нет» – Larry

+0

Пожалуйста, объясните больше. Добавить эту проверку, прежде чем что-нибудь произойдет? А также как он выглядит декодированным или что вы подразумеваете под декодированием? – Alice

1

Это звучит для меня как str_replace является то, что вы ищете.

Например:

$text = "%acheron"; 
$search = "%"; 
$replace = ""; //or whatever you want to replace it with 
echo str_replace($search, $replace, $text); 

Вы можете как хорошо сделать массив для $search и, соответственно, массив для $replace

+0

К сожалению, к тому моменту, когда вы получите строку в скрипте, это не будет работать. % ac часть строки входит как знак «нет». таким образом, я не могу его очистить таким образом: (возможно, я забыл упомянуть, что это входной файл из базы данных (GET) – Larry