PHP strpos 特殊字符

3

我使用的是 PHP 版本 5.1.6。

我有一个字符串(会话文件),需要从中提取一个值,所以我正在搜索字符串中的关键字,但它返回 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 中搜索特殊字符?


';SERVER_NAME|s:17:"' !== ';SERVER_NAME|s:"' --- 字符串中不存在该字符 - acm
尽管正确的答案仍然是unserialize()和array_search。 - Your Common Sense
unserialize() 无法处理此字符串格式(如果使用 serialize() 对字符串进行序列化,则格式与此不同),这是我的第一个选择,但未能成功实现它。 - Radu Maris
我偶然发现了这个问题,并记得我实现了bmorel在http://www.php.net/manual/en/function.session-decode.php#56106中发布的文档注释中的代码(到目前为止它还没有失败,但我只在那个正在运行的项目中使用过它)。 - Radu Maris
4个回答

2
您正在搜索的是 ;SERVER_NAME|s:",显然在原串中不存在。我猜您的意思应该是将 ;SERVER_NAME|s:17:" 作为搜索的针头。请注意,这里保留了HTML标签。
$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

我在使用strpos函数时遇到了问题,因为我用单引号'开头的needle字符串去搜索一个包含双引号"的字符串。

示例1 - 不起作用:

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

解释: 由于某些原因,双引号(")即使我们用单引号(')开始字符串,也会结束字符串。
示例2-不起作用:
strpos($text,'class=\"level')

解释: 在双引号(")之前有一个转义符,但它没有起到作用。
示例3 - 成功了!:
strpos($text,"class=\"level")

解释: 如果您以双引号开头的针线字符串,那么您可以使用反斜杠(\)转义双引号。
希望这有所帮助...

谢谢,非常有用的信息,如果还没有BUG,请向PHP日志提交一个BUG。 - Radu Maris

1

我认为你认为它是假的,因为字符串的位置可能是0,这会被评估为FALSE(假设你正在使用一个存在于字符串中的针)。你应该总是使用===进行比较。

文档(一个大红色警告框)中:

警告

此函数可能返回布尔值FALSE,但也可能返回一个非布尔值,例如0"",这些都会被评估为FALSE。请阅读布尔值部分以获取更多信息。使用===运算符测试此函数的返回值。

对我来说,它与"完美配合。第一个echo没有输出任何内容,因为子字符串;SERVER_NAME|s:"确实不包含在原始字符串中。


代码中的字符串位置不是0,只是我提取了字符串的一部分作为示例。这是一个拼写错误。 - Radu Maris

0

为什么不先对这个字符串进行unserialize操作呢?

至于这些字符,它们并没有什么特殊之处。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接