Превратите RSS в массив, взорвите «описание» и вставьте слова в таблицу MySQL по одному в строке - PullRequest
0 голосов
/ 13 мая 2010

Я только недавно попал в php и MySQL и хочу взять RSS-канал, превратить его в массив, взять только часть описания XML, разобрать его и вставить в таблицу на базе MySQL.

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

Результат, который я ищу, должен взять описание "Это кот" и вставить его в таблицу с двумя полями

ID термин
1 Это
2 - это
3 а
4 кота

Я был озадачен этим пару дней. Любая помощь будет отличной.

Основываясь на помощи Мэтта, вот что у меня есть. На сервере, похоже, возникла проблема с тэгом "new MySQLi", поэтому я попытался изменить его, но он все еще ничего не вносит в мою таблицу ...

<code> 

<p>$host="*******";
$username="*********";
$password="********";
$database="**********";</p>

<p>mysql_connect($host,$username,$password);
@mysql_select_db($database) or die( "Unable to select database");</p>

<p>$parser = xml_parser_create('UTF-8');
$values = array();
xml_parse_into_struct($parser, file_get_contents('*********'), $values);</p>

<p>$query = "INSERT INTO words VALUES('',$word)";</p>

<p>foreach ($values as $entry) {
    if ($entry['tag'] === 'SUMMARY') {
        $words = preg_split('/\s+/', strtolower(preg_replace('/[^A-Za-z\s]+/', '', strip_tags($entry['value']))));
        foreach ($words as $word) {
            $query->bind_param('s', $word);
            $query->execute();
        }
    }
}</p>

<p>mysql_close(); 

Спасибо всем!

Ответы [ 3 ]

1 голос
/ 13 мая 2010

Пока RSS-канал является допустимым XML, вы можете использовать PHP XML-парсер для этого ..

Вот простой пример работы с Последние вопросы в Stack Overflow.

<?php
$parser = xml_parser_create('UTF-8');
$values = array();
xml_parse_into_struct($parser, file_get_contents('feed.xml'), $values);

$db = new MySQLi('localhost', 'root');
$db->select_db('test');
$db->query('create table if not exists words (id int unsigned primary key auto_increment not null, word varchar(255) not null)');
$stmt = $db->prepare('insert into words (word) values(?)');

foreach ($values as $entry) {
    if ($entry['tag'] === 'SUMMARY') {
        $words = preg_split('/\s+/', strtolower(preg_replace('/[^A-Za-z\s]+/', '', strip_tags($entry['value']))));
        foreach ($words as $word) {
            $stmt->bind_param('s', $word);
            $stmt->execute();
        }
    }
}

Как только вы это сделаете, вы можете запускать забавные запросы, такие как:

select word, count(*) from words
group by word
order by count(*) desc

, который возвращает наборы результатов, такие как:

+------+----------+
| word | count(*) |
+------+----------+
| the  |      127 |
| i    |       90 |
| to   |       74 |
|      |       60 |
| a    |       59 |
| is   |       45 |
| in   |       44 |
| and  |       41 |
| it   |       38 |
| have |       31 |

etc ...
1 голос
/ 13 мая 2010

Вы можете использовать класс чтения RSS, например, http://www.phpclasses.org/package/2552-PHP-Retrieve-and-parse-RSS-feeds-extending-feed-reader.html

Это действительно просто использовать:

include("./files_includes/RSSReader.inc.php"); 
$rss = new RSSReader("http://www.php.net/news.rss");

см. Пример на http://www.phpclasses.org/browse/file/10759.html

Я не очень понимаю, почему вы хотели бы взорвать все слова в описании, но с этим классом вы могли бы сделать что-то вроде:

explode(' ',$rss->getItemDescription("rsstext",$i));

Имейте в виду, что класс зависит от FeedReader-класса: http://www.phpclasses.org/package/1811-PHP-Parse-and-extract-information-from-RSS-2-0-feeds.html - так что вам нужно его тоже скачать.

0 голосов
/ 13 мая 2010

Вы должны получить предложение VALUES в форме ('word1'),('word2'), ... Примерно так должно работать:

$string="This is a cat";
$arr=explode(' ',$string);
array_walk($arr, function(&$v,$i){ $v="('$v')"; }); //php5.3 syntax only, use create_function() otherwise

$values=implode(','$arr);
$query="INSERT INTO mytable(term) VALUES $values";
...