2013-12-09 3 views
0

Я не знаю, где именно моя проблема, надеюсь, вы можете мне помочь. 2 часа поиска не помогли. :/Странное поведение preg_replace превращает символы в числа

Я извлекаю строку из базы данных простым SELECT string FROM table. Это то, что я получаю, когда я повторяю это:

echo $string;     -> some-string 
echo htmlspecialchars($string); -> some-string 

Это уже странно, я думаю, потому что если я изменить запрос к

SELECT string FROM table WHERE string LIKE '%some-string%'; 

используя знак минус на клавиатуре, то результат пусто. Я пробовал разные наборы символов («SET NAMES ...»), но здесь ничего не изменилось. Поэтому я придерживаюсь «SET NAMES utf8», мой PHP-документ также кодируется UTF-8. Кто-нибудь знает, что моя проблема?

Что происходит дальше, еще более странно:

echo preg_replace("/[^0-9a-zA-Z]/", "+", $string); 

Это должно заменить все не алфавитно-цифровой символ со знаком плюс, не так ли? Таким образом, мое ожидание будет some+string но эхо:

some++45+string 

Что я здесь отсутствует? Любая помощь высоко ценится.

+0

Что произойдет, если вы попробуете 'SELECT string FROM table WHERE string LIKE '% some - string%';'? –

+1

Это правильно, так как '& #' перед '45' превращается в' ++ 'и'; 'после' 45' превращается в '+'. Итак, финальная строка становится: 'some ++ 45 + string' – anubhava

+0

Я считаю, что вы должны использовать' preg_replace ("/ [^ a-zA-Z] + /", "+", $ string); 'get' some + string' – anubhava

ответ

0

Данные хранятся в вашей базе данных как some-string. При отображении в браузере это отображается как some-string. При использовании htmlspecialchars это some-string, как вы говорите. Попробуйте просмотреть исходный код и вы должны увидеть следующее для каждого соответственно:

some-string 
some-string 

Вы можете изменить параметры поиска MySQL искать %some-string% и она должна работать, но это плохо рекомендуется хранить HTML закодированные данные в базе данных , Вы должны хранить необработанные данные и кодировать их по мере необходимости для отображения. Возможно, что исходные данные были получены с буквальным номером 10, но я сомневаюсь, что это так. Вы можете потратить время на декодирование всех сохраненных вами данных.

+0

Спасибо! Отличный ответ! Я бы никогда не подумал, что данные хранятся так. Я не хранил данные, и я не могу их изменить. Мне просто нужно работать с тем, что там ... – HeikoS

Смежные вопросы