2016-08-24 3 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; 

Я ожидал, что последний будет работать. Я думаю, что это будет на реальном веб-сервере, потому что кажется, что этот онлайн-тестер php добавляет дополнительные 4 символа в начале строки, которая удерживает последние четыре от удаления.

Я пошел и попробовал http://sandbox.onlinephpfunctions.com/ дальше, а исходные строки без каких-либо функций htmlspecialchar работали точно так, как я ожидал. Я использовал одну и ту же версию в обоих случаях. Теперь я очень смущен.

Извините за длинный пост. Если кто-то может объяснить мне, как php анализирует html-теги, я бы очень благодарен. Благодарю.

+0

PHP не анализирует HTML случайно. Чтобы на самом деле разобрать HTML, вы хотите, например, Расширения DomDocument или SimpleXML. Как вы сказали, ваш пост довольно длинный, поэтому мне сложно найти то, что вы пытаетесь получить. –

+0

php не имеет представления о том, что такое html. это просто text.but, так как вы закомментировали свой 'scrape_str', вы фактически выполняете свой' === false' тест против результатов 'substr()', который будет возвращать 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 < и >, а другие имеют тег заголовка
  • То, что вы работаете с является & усилителя ; gt с 7 начинается с 0, вы получаете; в качестве отправной затем взять все оставшиеся

FYI свой контекстуальный, если не будет ложным, если вы не имеете строку или ваше начало, где у вас нет индексировать т.е. 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'; 
} 
...... 
Смежные вопросы