2014-09-28 36 views
0

我使用下面的PHP代碼訪問外部HTML文件,一旦訪問,存在一個foreach循環,通過HTML搜索來查找兩個其他字符串之間存在的特定字符串。PHP在多個HTML行中搜索字符串

當兩個搜索字符串($ start_limiter和$ end_limiter)位於HTML文件的同一行時,此搜索可以正常工作。但是,當他們在單獨的線路上不起作用。

我需要能夠獲取兩個搜索字符串之間的字符串,無論他們在哪一行。

<?php 

function findText($start_limiter,$end_limiter,$url) 
{ 
    $start_pos = strpos($url,$start_limiter); 
    if ($start_pos === FALSE) 
    { 
     return FALSE; 
    } 

    $end_pos = strpos($url,$end_limiter,$start_pos); 

    if ($end_pos === FALSE) 
    { 
     return FALSE; 
    } 

    return substr($url, $start_pos+1, ($end_pos-1)-$start_pos); 
} 


$url = file("testResults.html"); 

$start_limiter = "firstString"; 
$end_limiter = "lastString"; 



foreach ($url as $number => $line) 
{ 
    $res = findText($start_limiter, $end_limiter,trim($line)); 



    if ($res != FALSE) 
    { 

     $str2 = substr($res, 9); 


    echo $str2; 
     ?><br /><?php 

} 


} 
+0

使用'file_get_contents'和'strpos'中的偏移參數 – 2014-09-28 09:12:15

回答

1

在這種情況下,最好分析整個字符串,而不是處理部分數據(逐行)。

只需使用file_get_contents()而不是file()(逐行讀入數組),它將整個頁面讀入一個字符串並刪除多餘的foreach循環。

+0

感謝您的回答。你能給我一個關於語法看起來如何的提示或例子嗎?我一直在尋找解決方案,但一直沒有找到解決的辦法。例如,如何遍歷file_get_contents()生成的字符串以獲取搜索標記之間包含的字符串內容? (firstString *內容我想* lastString)。請注意,firstString和lastString會在HTML文件中出現很多次,我需要將每個單獨的結果編譯成一個列表...因此,我正在使用的foreach循環。 – user2949513 2014-09-28 11:08:42

+0

例如'$ offset = 0; while(false!== $ text = findText($ startLimiter,$ endLimiter,$ file,$ offset){/ *用$ text * /}做某些事情,其中​​'$ file'是'file_get_contents'和'$在'findText()'函數內部設置一個引用,你總是將其設置爲最後一個'$ end_limiter'結束的位置(例如'$ offset = $ end_pos + strlen($ end_limiter);'),然後你可以使用'$ offset作爲第一個strpos()調用的第三個參數。 – bwoebi 2014-09-28 15:06:09

0

相反file()功能,你可以用file_get_content()

的file_get_contents - 將整個文件讀入一個字符串

文件 - 整個文件讀入一個數組

<?php 
$url = file_get_contents("testResults.html"); 

function findText($start_limiter,$end_limiter,$url) 
{ 
    $start_pos = strpos($url,$start_limiter); 
    if ($start_pos === FALSE) 
    { 
     return FALSE; 
    } 

    $end_pos = strpos($url,$end_limiter,$start_pos); 

    if ($end_pos === FALSE) 
    { 
     return FALSE; 
    } 

    return substr($url, $start_pos+1, ($end_pos-1)-$start_pos); 
} 

$start_limiter = "firstString"; 
$end_limiter = "lastString"; 
$res = findText($start_limiter, $end_limiter,trim($line));