Пытается сделать некоторые веб-скребки, но не понимает, как 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>this is a test </title>
Input
$start=<title>
$end=</title>
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="<title>"
$end="</title>"
Output
<title> </title>
(blank line)
13
<title>this is a test </title>
>this is a test </title>
Я ожидал, что последний будет работать. Я думаю, что это будет на реальном веб-сервере, потому что кажется, что этот онлайн-тестер php добавляет дополнительные 4 символа в начале строки, которая удерживает последние четыре от удаления.
Я пошел и попробовал http://sandbox.onlinephpfunctions.com/ дальше, а исходные строки без каких-либо функций htmlspecialchar работали точно так, как я ожидал. Я использовал одну и ту же версию в обоих случаях. Теперь я очень смущен.
Извините за длинный пост. Если кто-то может объяснить мне, как php анализирует html-теги, я бы очень благодарен. Благодарю.
PHP не анализирует HTML случайно. Чтобы на самом деле разобрать HTML, вы хотите, например, Расширения DomDocument или SimpleXML. Как вы сказали, ваш пост довольно длинный, поэтому мне сложно найти то, что вы пытаетесь получить. –
php не имеет представления о том, что такое html. это просто text.but, так как вы закомментировали свой 'scrape_str', вы фактически выполняете свой' === false' тест против результатов 'substr()', который будет возвращать false только при ошибке. –
Если php рассматривает html как просто текст, то почему он читает