2013-04-10 74 views
1

我有一個奇怪的問題...PHP strpos()找到的只是單個字符,而不是整個字符串

我想搜索一個日誌文件。

$lines = file($file); 

$sampleName = "T3173sGas"; 

foreach ($lines as &$line) { 

if (strpos($line, $sampleName) !== false) { 
echo "yes"; 
    } 
} 

此代碼不能正常工作,$sampleName是在日誌文件中100%。搜索僅適用於單個字符;例如"T""3",但不適用於"T3"

你知道爲什麼它不起作用嗎?日誌文件的編碼是否錯誤?

非常感謝您的幫助!

+1

可能的是,該日誌文件的編碼是UTF-16,在這種情況下'strpos'不會爲多字符,但工作仍然適用於單身。請嘗試['mb_strpos'](http://php.net/manual/en/function.mb-strpos.php)。 – Jon 2013-04-10 09:32:05

回答

2

如果你只能找到單個字符,我會假設你的日誌文件是一些多字節字符集,如UTF-16。正如你已經假設類似的,下一步你要參考你正在嘗試使用的關於字符編碼的日誌文件的文檔/規範。

然後您可以使用字符編碼特定的字符串函數,該包名爲http://php.net/mbstring

$encoding = ... ; // encoding of logfile 

if (mb_strpos($line, $sampleName, 0, $encoding) !== false) { 
    echo "yes"; 
} 
+0

感謝您的快速回答。我寫道:「$ encoding =」UTF-16「;然後」if(mb_strpos($ line,$ sampleName,0,$ encoding)!== false){...}「但沒有成功:( – user2089120 2013-04-10 09:55:18

+0

您跳過最重要的部分是:首先要了解具體的編碼,編碼在猜測時不能很好地工作,只有在知道的情況下才能正常工作,如果你有問題需要知道,從日誌文件中提供一個樣本,包括純文本作爲一個hexdump,並指定這個日誌文件是系統的一部分 – 2013-04-10 09:57:58

+0

哦,我的天啊 - 那是很難的東西......我嘗試了幾件事......一個小軟件告訴我,編碼是「windows-1252」......但它不起作用,當我使用mb_detect_encoding($ fileContent,「utf-8,windows-1251,windows-1252,iso-8859-1,ascii」)時,它選擇iso-8859-1,但是「iso-8859- 1「也不起作用,我迷路了:)你有什麼想法嗎?非常感謝你的幫助! – user2089120 2013-04-10 19:30:33

0

這可以工作,它搜索整個字符串

<?php 
$filename = 'test.php'; 
$file = file_get_contents($filename); 
$sampleName = "T3173sGas"; 
if(strlen(strstr($file,$sampleName))>0) 
{ 
echo "yes"; 
} 
?> 
相關問題