2010-05-12 241 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 2010-05-12 13:01:28

+0

仍然反序列化()和数组搜索 – 2010-05-12 13:58:54

+0

unserialize()不适用于这种格式的字符串(如果我用serialize()序列化字符串格式不是这样),这是我第一次选择,但没有成功在实施它。 – 2010-05-12 14:12:35

回答

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(大红色警告框):

警告

这个函数可以返回布尔FALSE,但也可能返回的结果为FALSE非布尔值,例如如0""。有关更多信息,请阅读布尔部分。使用===运算符来测试此函数的返回值。

它可以完美地与我"。第一个回显没有打印任何内容,因为子字符串;SERVER_NAME|s:"确实不包含在原始字符串中。

+0

代码中的字符串位置不是0,只是在示例中我只提取了字符串的一部分。这是一个错字。 – 2010-05-12 13:33:37

+1

@Radu:好的。无论如何,牢记这一点很重要。 – 2010-05-12 13:49:11

0

为什么不以unserialize这个字符串先?

为这些字符,并没有什么特别在他们

1

我有一个strpos问题,因为我用一个引号启动了一个针串,并搜索了一个包含双引号的字符串“。

例1 - 不工作:

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

说明: 双引号(“)由于某种原因而结束,即使我们开始串一个引号(')的字符串

例2。 - 不工作:

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

说明: 有一个逃生标志前双引号(“),但它不执行它的功能。

例3 - 作品!:

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

说明: 如果启动针串用双引号就可以,然后逃逸双引号用反斜杠()。

希望它可以帮助....

+0

Tks,非常有用的信息,如果没有一个准备好的话,你应该记录一个BUG到PHP。 – 2010-09-16 11:37:14