2016-08-24 104 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'; 
} 
......