25.06.2018, 08:13
|
Профессор
|
|
Регистрация: 02.05.2016
Сообщений: 390
|
|
Парсер xml через php подскажите ?
Есть мастера PHP ? (Парсер RSS)
Помогите:
1.Вывести картинку у новостей (у меня получилось вывести простую ссылку)
2.Заголовок сделать ссылкой на оригинальную новость на сайте.
3.Дату на Русском (Вывел но она на Английском языке)
демо: страница http://h116641.s08.test-hf.su/rss/rss.php
Вот рабочий код (Может в нём полно ошибок, но не много) - знаний не хватает.
<?php
header('Content-Type: text/html; charset=UTF-8');
$path = 'https://62.xn--b1aew.xn--p1ai/news/rss';;
$ctx = stream_context_create(array('http' => array('timeout' => 6)));
$file = file_get_contents($path, 0, $ctx);
if ($file) {
$rss = simplexml_load_string($file);
foreach ($rss->channel->image as $image){
$image = $image->url;
echo "$image";
}
foreach ($rss->channel->item as $item){
$namespaces = $item->getNameSpaces(true);
$yandex = $item->children($namespaces['yandex']);
$full_text = (string)$yandex->{'full-text'};
$full_text = mb_substr(strip_tags($full_text), 0, 9250, 'UTF-8');
$title = $item->title;
$pubDate = $item->pubDate;
$pubDate = date("D, d M Y H:i:s T", strtotime($pubDate));
echo "<div style='margin-bottom: 20px;font-weight: bold;'>{$title}</div>";
echo "<div style='margin-bottom: 20px;'>{$pubDate}</div>";
echo "<div style='margin-bottom: 20px;'>{$full_text}</div>";
if (isset($item->enclosure)) {
echo $item->enclosure["url"].'<br>';
}
}
}
?>
Последний раз редактировалось spinastr, 25.06.2018 в 23:26.
|
|
25.06.2018, 08:52
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Ну не знаете вы языка, но то что данный вопрос к JS отношения не имеет это же понятно. Есть же раздел для вопросов по серверным языкам.
Функция date не поддерживает локаль, вместо нее нужно использовать strftime - $pubDate = strftime("%a, %d %m %Y %H:%M:%S %Z", strtotime($pubDate)). И перед использованием этой функции установить русскую локаль.
|
|
25.06.2018, 23:18
|
Профессор
|
|
Регистрация: 02.05.2016
Сообщений: 390
|
|
laimas,
Здравствуйте!
Я точно ничего не знаю а в каких строчках кода что нужно заменить?
Подскажите пожалуйста.
Я просто хотел сделать страницу с новостями и если в них есть картинка и всё. С ссылкой заголовка на новость. Это наверно легче чем курс валют.
|
|
26.06.2018, 06:19
|
Профессор
|
|
Регистрация: 02.05.2016
Сообщений: 390
|
|
laimas,
Здравствуйте я подумал может поможите сделать типа как с курсом валют вот тут? ссылка
|
|
26.06.2018, 10:37
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Заменить строку 28 кода на приведенный код. Но нужно еще установить локаль, а есть небольшие "капризы" ее установки, которые зависят от системы. Но функция установки локали может принимать массив локалей, поэтому что-то из приведенного должно сработать:
setlocale(LC_TIME, 'ru_RU.UTF8', 'rus_RUS.UTF8', 'Russian_Russia.UTF8');
$pubDate = strftime("%a, %d %b %Y %H:%M:%S %Z", strtotime($pubDate));
Формат вывода временной зоны (%Z или %z) также зависит от системы.
|
|
27.06.2018, 00:01
|
Профессор
|
|
Регистрация: 02.05.2016
Сообщений: 390
|
|
laimas,
Всё верно?
<!DOCTYPE html>
<meta name="viewport" content="width=device-width; initial-scale=0.85; maximum-scale=0.85; user-scalable=0;" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<?php /* Ссылка на заколовки RSS(echo "<h2><a href='". $item->link. "'>". $item->title. "</a></h2>";); */ ?>
<style>
body {
margin: 0;
padding: 0;
font-family: 'Open Sans', Tahoma, sans-serif;
font-size: 15px;
line-height: 1.55em;
width: 100%;
overflow-x: hidden;
}
h1, .h1 {display:block;padding-bottom:5px;color:#1d1d1d;font-size:16px;font-weight:normal;margin-top:0}
h2, .h2 {display:block;margin:0;padding: 0px 0px 10px 0px;font-size:16px;color:#1d1d1d;font-weight:bold;text-align: center;}
h3, .h3 {display:block;margin:0;padding:0;font-size:16px;color:#1d1d1d;font-weight:bold}
h4, .h4 {display:block;margin:0;padding:0;font-size:12px;color:#1d1d1d;font-weight:bold}
a {color:#173a51;text-decoration:underline}
a:hover, a:active {color:#f84040;text-decoration:underline}
</style>
<body>
<?php
header('Content-Type: text/html; charset=UTF-8');
$path = 'https://62.xn--b1aew.xn--p1ai/news/rss';
$ctx = stream_context_create(array('http' => array('timeout' => 6)));
$file = file_get_contents($path, 0, $ctx);
if ($file) {
$rss = simplexml_load_string($file);
foreach ($rss->channel->item as $item){
$namespaces = $item->getNameSpaces(true);
$yandex = $item->children($namespaces['yandex']);
$full_text = (string)$yandex->{'full-text'};
$full_text = mb_substr(strip_tags($full_text), 0, 9250, 'UTF-8');
$title = $item->title;
$pubDate = $item->pubDate;
$pubDate = strftime("%Y-%m-%d %H:%M:%S", strtotime($pubDate));
echo "<h2><div style='margin-bottom: 20px;font-weight: bold;'>{$title}</div></h2>";
echo "<div style='text-align: center;'><img src='". $item->enclosure["url"]. "'></div>";
echo "<p>". $item->description. "</p>";
echo "<div style='margin-bottom: 20px;'>{$pubDate}</div>";
echo "<div style='margin-bottom: 20px;'>{$full_text}</div>";
echo '<hr align="center" width="50%" size="2" color="#ff0000" /></br></br></br>';
}
}
?>
</body>
Эту страницу я вставляю через ifraim на сайт. Скажите это тяжёлая нагрузка на сайт?
Может есть вариант через Json сделать как курс валют?
|
|
27.06.2018, 00:14
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Сообщение от spinastr
|
Всё верно?
|
Что именно? Вопрос был таков - 3.Дату на Русском (Вывел но она на Английском языке)
На русском это значит Январь, Февраль, ... В коде формат даты определялся как "D, d M Y H:i:s T". Что все эти буковки для функции date() означают я пояснять не буду, читать тут. И не будет на русском, так как функция date этого не сделает, о чем было сказано, а чтобы на русском, то нужна функция strftime(). Ее формат даты для аналогичного вывода будет таким - "%a, %d %b %Y %H:%M:%S %Z", что эти буковки означают читать тут.
Теперь оказывается, что нужно просто дату/время без текста "%Y-%m-%d %H:%M:%S". Зачем тогда strftime, хотя можно и ее нагрузить.
Сообщение от spinastr
|
Эту страницу я вставляю через ifraim на сайт. Скажите это тяжёлая нагрузка на сайт?
|
Серверу ка-то по боку во фрейм ли это будет грузиться или нет, нагрузка определяется не этим.
|
|
27.06.2018, 00:46
|
Профессор
|
|
Регистрация: 02.05.2016
Сообщений: 390
|
|
laimas,
Вставлял два ваших варианта не работало
setlocale(LC_TIME, 'ru_RU.UTF8', 'rus_RUS.UTF8', 'Russian_Russia.UTF8');
$pubDate = strftime("%a, %d %b %Y %H:%M:%S %Z", strtotime($pubDate));
подумал нечего мучится и оставил просто числа.
А можно перевести всё в json и вывести на сайте через js?
|
|
27.06.2018, 05:47
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Можно. Оставить из всего только РНР код парсера и вместо вывода сформировать массив:
$json = [
'title' = $item->title,
'text' = mb_substr(strip_tags($full_text), 0, 9250, 'UTF-8'),
и так далее
];
который по запросу отдать клиенту - json_encode($json); Как делается, пример у вас уже есть.
|
|
27.06.2018, 22:09
|
Профессор
|
|
Регистрация: 02.05.2016
Сообщений: 390
|
|
laimas,
А можно более подробно?
Я просто js и php знаю на 1%
|
|
|
|