2016-08-24 103 views
0

試圖做一些網頁抓取,但無法理解PHP如何解析html標籤。我目前不在我的網絡服務器上,所以我在線測試代碼。 在http://phptester.net/我的代碼是這樣的:PHP和html標籤

<?php 
$start = "<title>"; 
$end = "</title>"; 
$data = "<title>this is a test </title>"; 
echo $start . " " . $end . " " . "<br>"; 
echo $data . "<br>"; 
echo strlen($start) . "<br>"; 
echo htmlspecialchars($data) . "<br>"; 
$data = stristr(htmlspecialchars($data), htmlspecialchars($start)); 
$data = substr(htmlspecialchars($data), strlen($start)); 

if($data===false){ 
    echo 'string not found'; 
} 
else{ 
    echo $data; 
} 

現在幾個樣品的輸入和輸出。

Input 
    $start="<title>" 
    $end="</title>" 
Output 
    (blank line) 
    (blank line) 
    7 
    <title>this is a test </title> 
    ;title&gt;this is a test &lt;/title&gt; 

Input 
    $start=&lt;title&gt; 
    $end=&lt;/title&gt; 
Output 
    <title> </title> 
    (blank line) 
    13 
    <title>this is a test </title> 
    string not found 

更改

$data = stristr(htmlspecialchars($data), htmlspecialchars($start)); 

$data = stristr(htmlspecialchars($data), $start); 

和複檢。

Input 
    $start="<title>" 
    $end="</title>" 
Output 
    (blank line) 
    (blank line) 
    7 
    <title>this is a test </title> 
    string not found 

Input 
    $start="&lt;title&gt;" 
    $end="&lt;/title&gt;" 
Output 
    <title> </title> 
    (blank line) 
    13 
    <title>this is a test </title> 
    &gt;this is a test &lt;/title&gt; 

我期待着最後一個工作。我認爲它會在一個實際的Web服務器上,因爲這個在線php測試人員似乎在字符串的開頭插入了一個額外的4個字符,這使得最後四個字符被刪除。

我去了,然後嘗試http://sandbox.onlinephpfunctions.com/下一步,沒有任何htmlspecialchar函數的原始字符串完全按照我的預期工作。我在他們中都使用了相同的版本。現在我很困惑。

對不起,很長的文章。如果有人可以向我解釋如何php解析html標籤,我會非常感激。謝謝。

+0

PHP不會隨機解析HTML。爲了實際解析你想要的HTML DomDocument或SimpleXML擴展。正如你所說,你的帖子很長,所以我很難確定你想要做什麼。 –

+0

php不知道html是什麼。它只是text.but,因爲你已經註釋掉了'scrape_str',你實際上是在對'substr()'的結果進行'=== false'測試,它只會在失敗時返回false。 –

+0

如果php將html視爲文本,那麼爲什麼它會將視爲特殊字符?爲什麼它不僅僅把它當作一個普通的字符串呢? – user3736114

回答

0

這不是PHP解析,因此造成了很多混亂。大多數情況下,你只是在看字符串操作。

所以讓更多的上下文輸出我的主機下面的代碼

$start = "<title>"; 
$end = "</title>"; 
$data = "<title>this is a test </title>"; 
echo "Showing Start: " . $start . " " . $end . " " . "<br>"; 
echo "Showing Data: " . $data . "<br>"; 
echo "Showing LEN Start: " . strlen($start) . "<br>"; 
echo "Showing Data special: " . htmlspecialchars($data) . "<br>"; 
$data = stristr(htmlspecialchars($data), htmlspecialchars($start)); 
echo "Showing Data stristr: " . $data . "<br>"; 
$data2 = stristr(htmlspecialchars($data), $start); 
echo "Showing Data2 stristr: " . $data2 . "<br>"; 
$data = substr(htmlspecialchars($data), strlen($start)); 
if($data===false){ 
    echo 'string not found'; 
} 
else{ 
    echo "Showing Data substr: " . $data . "<br>"; 
} 

將提供以下的輸出:

Showing Start: 
Showing Data: 
Showing LEN Start: 7 
Showing Data special: <title>this is a test </title> 
Showing Data stristr: <title>this is a test </title> 
Showing Data2 stristr: 
Showing Data substr: ;title&gt;this is a test &lt;/title&gt; 

解釋上述每一行。

  • 標籤正在被
  • 標籤是由瀏覽器長度
  • 渲染的瀏覽器中呈現爲7
  • 標籤變爲ASCII <和>瀏覽器會顯示什麼的意味着但不要渲染標籤。
  • 由於兩個標籤逃脫你可以找到
  • 因爲只有數據被轉義沒有匹配一個ASCII <和>和其他有標題標籤的整個字符串
  • 您正在使用什麼是&放大器;從7開始從0開始計數;作爲你的起點,然後採取所有的剩餘

僅供參考,如果你將永遠不會是假的,除非你沒有,你有沒有指標即70

0

你顯然有錯誤的字符串或你的開始碼。您正在使用多個=操作重寫$data變量。相反,使用這樣的事情:

......... 
$data = "<title>this is a test </title>"; 
......... 
$data1 = stristr(htmlspecialchars($data), htmlspecialchars($start)); 
$data2 = substr(htmlspecialchars($data), strlen($start)); 
......... 
if (!$data1 && !$data2){ 
    echo 'not found'; 
} 
......