2010-05-12 4 views
2

Я использую PHP версии 5.1.6PHP StrPos специальные символы

У меня есть строка (файл сеанса) и нужно извлечь значение из него, поэтому я найти иголку в строке, но возвращает false, я уменьшил код до этого:

$string = ';SERVER_NAME|s:17:"stackoverflow.com";REMOTE_ADDR|s:13:"69.59.196.211";'; 
$start = strpos($string, ';SERVER_NAME|s:"'); 
echo $start; // prints nothing because $start = false 

$start = strpos($string, 'SERVER_NAME|s:'); 
echo $start; // prints 1; 

Как вы заметили, если у меня есть символ ';' или символ «» в игле, поиск возвращает false, я попытался использовать chr() для всех символов в игле, но имел тот же результат. Если я удалю ';' и '' 'из строки, если находит иглу в строке.

Как я могу найти специальные символы в строке с помощью PHP?

+0

'; SERVER_NAME | S: 17: "' == '; SERVER_NAME | S:"' --- игла нет в строке – acm

+0

Хотя правильный ответ still unserialize() и поиск массива –

+0

unserialize() не работает с этим форматом строки (если я сериализую строку с serialize(), формат не совпадает с этим), это был мой первый выбор, но не был успешно в его реализации. –

ответ

2

Вы ищете ;SERVER_NAME|s:", который явно не присутствует в стоге сена. Думаю, вы хотели использовать ;SERVER_NAME|s:17:" в качестве иглы.

$start = strpos($string, ';SERVER_NAME|s:17:"'); 
echo $start; // prints 0 

Это была опечатка, что я пропустил, извините проблема решена. Правильный код:

$result = ';SERVER_NAME|s:17:"stackoverflow.com";REMOTE_ADDR|s:13:"69.59.196.211";'; 
$str_start = ';SERVER_NAME|s:'; 
$str_end = ':"'; 
$start = strpos($result, $str_start)+strlen($str_start); 
$end = strpos($result, $str_end, $start); 
$len = $end - $start; 
$str_len = substr($result, $start, $len); 
echo $server_name = substr($result, ($end + strlen($str_end)), $str_len); 

и в конце она печатает:

stackoverflow.com

Так это работает, спасибо всем за помощь!

1

Я бы сказал, что вы считаете, что это ложь, потому что позиция строки может быть 0, которая оценивается как FALSE (при условии, что вы используете иглу, которая присутствует в строке). Вы всегда должны сравнивать с ===.

С (большой коробке красный предупреждающий сигнал) documentation:

Предупреждение

Эта функция может возвращать Boolean FALSE, но может также возвращать не-логическое значение, которое приводится к FALSE, такие как 0 или "". Пожалуйста, прочитайте раздел о Booleans для получения дополнительной информации. Используйте оператор === для проверки возвращаемого значения этой функции.

Это прекрасно работает для меня с ". Первое эхо ничего не выводит, потому что подстрока ;SERVER_NAME|s:" действительно не содержится в исходной строке.

+0

позиция строки не равна 0 в коде, как раз в примере я извлек только часть строки. Это была опечатка. –

+1

@ Radu: Хорошо. Во всяком случае, важно помнить об этом. –

0

почему не unserialize эта строка первая?

, как для этих персонажей, нет ничего особенного в них

1

У меня была проблема с strpos, когда я начал строку с иглой с одной цитатой и искал строку, содержащую двойную кавычку.

Пример 1 - Не работает:

strpos($text,'class="level') 

Объяснение: Двойная кавычка (") по какой-то причине заканчивается строка, даже если мы начали строку с одной кавычки (')

Пример 2. - не работает ли:

strpos($text,'class=\"level') 

Объяснение: Существует знак, побег, прежде чем двойной кавычки ("), но он не выполняет его функции.

Пример 3 - Работает !!:

strpos($text,"class=\"level") 

Объяснение: Если начать игольчатый строку с кавычками вы можете избежать двойные кавычки с обратной косой черты().

Надеется, что это помогает ....

+0

Tks, очень полезная информация, вы должны регистрировать BUG для PHP, если нет ни одного hasready. –

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