Я пытаюсь связать свою страницу с другим веб-сайтом, на котором я могу использовать теги 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 на одной странице могли быть помещены в массив, который затем может быть выведен в различные части таблицы.
Спасибо за вашу помощь заранее.
Дайте мне посмотреть, если я правильно понял, у вас есть что-то вроде этого:
<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].
Если вы намереваетесь получить все содержимое div с этим именем класса, вы можете использовать регулярное выражение для захвата этих строк между тегами этих div:
preg_match_all('/<div class="class">([^<]+)<\/div>/', $content, $m);
print_r($m[1]);
Сейчас $m[1]
будет массив, содержащий все эти внутренние строки HTML этих div.
Проблема, вероятно, состоит в том, что только первый ключ первого массива попадает во второй взрыв. Попробуйте следующее после $ activity:
$result = array();
foreach ($activity as $div){
$handle = explode("</div>", $div);
$result -> append($handle);
}
foreach ($result as $key){
echo $key;
}
Я прошу прощения за оригинальный ответ, я неправильно понял ваш вопрос.
Путь регулярных выражений также будет работать.
Правило таково: когда я работаю с 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>