2016-08-24 2 views
0

Versuchen, einige Web-Scraping zu tun, aber Probleme zu verstehen, wie PHP HTML-Tags analysiert. Ich bin momentan nicht auf meinem Webserver, also teste ich den Code online. Bei http://phptester.net/ meinen Code ist dies:PHP und HTML-Tags

<?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; 
} 

Jetzt ein paar Beispiel Ein- und Ausgänge.

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 

Ändern

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

zu

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

und Wiederholung der Prüfungen.

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; 

Ich hatte erwartet, dass der letzte funktioniert. Ich denke, es wird auf einem tatsächlichen Web-Server, weil es scheint, dass dieser Online-PHP-Tester fügt zusätzliche 4 Zeichen am Anfang der Zeichenfolge, die die letzten vier vor dem Löschen hält.

Ich ging und versuchte http://sandbox.onlinephpfunctions.com/ nächsten und die ursprünglichen Strings ohne irgendwelche htmlspecialchar Funktionen funktionierte genau so, wie ich erwartet hatte. Ich habe die gleiche Version in beiden verwendet. Jetzt bin ich sehr verwirrt.

Entschuldigung für die lange Post. Wenn jemand mir erklären kann, wie PHP HTML-Tags analysiert, würde ich es sehr schätzen. Vielen Dank.

+0

PHP analysiert HTML nicht zufällig. Um HTML tatsächlich zu analysieren, würden Sie z.B. DomDocument oder SimpleXML-Erweiterungen. Wie du schon sagtest, dein Beitrag ist ziemlich lang, so dass es mir schwer fällt, herauszufinden, woran du versuchst. –

+0

php hat keine ahnung was html ist. Es ist nur Text. Aber da Sie Ihren 'scrape_str' auskommentiert haben, machen Sie tatsächlich Ihren' === false' Test gegen die Ergebnisse von 'substr()', der bei einem Fehler nur false zurückgibt. –

+0

Wenn PHP HTML als nur Text behandelt dann warum liest es als spezielle Chatacters? Warum behandelt es nicht nur als normale Saite? – user3736114

Antwort

0

Dies ist nicht PHP-Parsing daher die Menge der Verwirrung, die Sie verursachen. Sie schauen sich meistens nur die String-Manipulation an.

So ein bisschen mehr Kontext mit dem Ausgang auf meinem Host den Code unten geben

$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>"; 
} 

die folgende Ausgabe liefert:

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; 

Erklärung für jede Zeile oben.

  • Der Tag vom Browser
  • gerendert wird
  • Der Tag vom Browser
  • Länge von 7
  • Der Tag <und> der Browser, was diese zeigen in ASCII gedreht wird gerendert wird meinen, aber render nicht ein Tag.
  • Da beide Tags entkommen Sie die gesamte Zeichenfolge
  • finden
  • Da nur Daten dort entkommen ist kein Spiel ist ascii <und> und der andere hat den Titel-Tag
  • Was Sie arbeiten ist & amp ; gt von 7 beginnend bei 0 kommend bekommst du; als Ausgangs nehmen dann die gesamte verbleibende

Ihre FYI, wenn nie falsch sein wird, es sei denn, Sie, wo Sie kein Index dh 70.

0

Sie haben noch einen String oder Start haben offensichtlich Fehler in der hat Code.Sie schreiben die $data Variable mit mehreren = Operationen um. Verwenden Sie stattdessen etwas wie folgt:

......... 
$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'; 
} 
......