file get content — php извлекает только одну строку из внешнего div из url

Я пытаюсь связать свою страницу с другим веб-сайтом, на котором я могу использовать теги div, чтобы поддерживать мой сайт в актуальном состоянии.

У меня есть некоторый код после некоторого исследования, и он выводит только одну строку, тогда как на странице есть несколько классов div, и я хотел бы повторить их все. Мне просто интересно, возможно ли это или нет?

Вот текущий код:

<?php
$url = 'http://www.domain.com';
$content = file_get_contents($url);
$activity = explode( '<div class="class">' , $content );
$activity_second = explode("</div>" , $activity );

echo $activity_second[0];
?>

Я могу эхо $activity_second[0] который будет отображать первую строку и $activity_second[1] который будет отображать вторую строку.

Тем не менее, я хочу расширить это, чтобы все классы div на одной странице могли быть помещены в массив, который затем может быть выведен в различные части таблицы.

Спасибо за вашу помощь заранее.

0

Решение

Дайте мне посмотреть, если я правильно понял, у вас есть что-то вроде этого:

<div id="another-class"><div class="class">some text 1</div></div>
<div class="class">some text 2</div>
<div class="class">some text 3</div>
<div class="class">some text 4</div>
<div class="class">some text 5</div>
<div class="class">some text 6</div>

И вам нужен текст, содержащий элементы div. Если это правильно, замените:

$activity = explode( '<div class="class">' , $content );
$activity_second = explode("</div>" , $activity );

с этим:

preg_match_all('#<div class="class">(.+?)</div>#', $content, $matches);

В этом примере после вызова функции $ match будет иметь следующее:

Array
(
[0] => Array
(
[0] => <div class="class">some text 1</div>
[1] => <div class="class">some text 2</div>
[2] => <div class="class">some text 3</div>
[3] => <div class="class">some text 4</div>
[4] => <div class="class">some text 5</div>
[5] => <div class="class">some text 6</div>
)

[1] => Array
(
[0] => some text 1
[1] => some text 2
[2] => some text 3
[3] => some text 4
[4] => some text 5
[5] => some text 6
)

)

Данные, которые вам нужны, находятся в $ match [1].

1

Другие решения

Если вы намереваетесь получить все содержимое div с этим именем класса, вы можете использовать регулярное выражение для захвата этих строк между тегами этих div:

preg_match_all('/<div class="class">([^<]+)<\/div>/', $content, $m);

print_r($m[1]);

Сейчас $m[1] будет массив, содержащий все эти внутренние строки HTML этих div.

0

Проблема, вероятно, состоит в том, что только первый ключ первого массива попадает во второй взрыв. Попробуйте следующее после $ activity:

$result = array();

foreach ($activity as $div){
$handle = explode("</div>", $div);
$result -> append($handle);
}
foreach ($result as $key){
echo $key;
}

Я прошу прощения за оригинальный ответ, я неправильно понял ваш вопрос.

Путь регулярных выражений также будет работать.

0

Правило таково: когда я работаю с HTML, я должен использовать парсер.

Предполагая, что у вас есть такой HTML-документ:

$html = '<html>
<head><title>Untitled</title></head>
<body>
<div class="class">
<b>My Content 1</b>
</div>
<div class="class">
<b>My Content 2</b>
</div>
<div class="class">
<b>My Content 3</b>
</div>
</body>
</html>';

загрузить его в DOMDocument объект, инициация DOMXPath объект на основе загруженного HTML:

$dom = new DOMDocument();
libxml_use_internal_errors(1);
$dom->formatOutput = True;
$dom->loadHTML( $html );
$xpath = new DOMXPath( $dom );

и с помощью этой команды вы можете получить доступ ко всем <div class="class">:

foreach( $xpath->query( '//div[@class="class"]' ) as $node )
{
echo trim( $node->nodeValue ) . '<br>';
}

Ваш вывод:

My Content 1
My Content 2
My Content 3

Если вы хотите отобразить узел как HTML, замените echo ...

с:

echo $dom->saveHTML( $node );

будет выводить:

<div class="class">
<b>My Content 1</b>
</div>
<div class="class">
<b>My Content 2</b>
</div>
<div class="class">
<b>My Content 3</b>
</div>

Наконец, если вы хотите, чтобы эхо только innerHTML из узлов, вы должны написать что-то вроде этого:

foreach( $xpath->query( '//div[@class="class"]' ) as $node )
{
foreach ($node->childNodes as $child)
{
echo $dom->saveHTML( $child );
}
}

и ваш вывод будет:

<b>My Content 1</b>
<b>My Content 2</b>
<b>My Content 3</b>

0
По вопросам рекламы [email protected]