2010-05-12 175 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