Доброго времени суток. У меня есть некий файл с информацией Код (Text): <?xml version="1.0" encoding="utf-8" ?> <feed xmlns="http://www.w3.org/2005/Atom" xml:base="http://rutracker.org/forum/"> <title>RPG</title> <updated>2014-05-28T13:40:01+00:00</updated> <id>tag:rto.feed,2000:/f/52</id> <link href="viewforum.php?f=52" /> <entry> <title><![CDATA[Final Fantasy III [L] [ENG|Multi5 / ENG] (2014) (1.0) [639 MB]]]></title> <author> <name>Rhadamanthus</name> </author> <updated>2014-05-27T19:05:05+00:00</updated> <id>tag:rto.feed,2014-05-27:/t/4749147</id> <link href="viewtopic.php?t=4749147" /> Я с помощью регулярных выражений хочу выдрать из него все содержание тега <title>. Я написал скрипт Код (Text): preg_match_all("/title>[^>]+>/",$content,$title); Но, вместо того, чтобы в массив занести данные из всех тегов <titile> на странице, он заносит результат только с первой пары тегов. Т.Е. на выходе я получаю только Код (Text): Array ( [0] => Array ( [0] => title>RPG А далее массив пуст.
пробуй не регулярными, а для начала file_get_xml() потом делаешь DOM объект и из него уже как с JS работаешь.
Дано: Есть http://ru.wikipedia.org/wiki/Atom и нужно его прочитать. Решение: идем на packagist и пишем там в строке поиска "Atom" https://packagist.org/search/?q=atom, выбираем понравившийся пакет, ну к примеру вот этот https://github.com/dg/rss-php и используем.
Странно. У меня больше выводит, только не правильно. А так? Код (PHP): $reg = '#<title>(.*)</title>#'; preg_match_all($reg, $content, $title); var_dump($title); Грубо, но должно работать. В $title[1] массив, в котором все тайтлы.
Это называется XML. SimpleXML в помощь. Кто ж регулярками XMLы читает....е-мое. Добавлено спустя 1 минуту 45 секунд: Опять костыли. Да что с тобой? Добавлено спустя 4 минуты: Код (Text): $data = new SimpleXMLElement($переменная_с_содержимым_файла); //Либо: $data = simplexml_load_file($переменная_с_путем_к_файлу); vardump($data->title); А еще лучше просто vardump($data); и кури структуру, что да как. Заодно почитай про xpath.
-Ребят, хочу зуб выдернуть пациенту. Помогите сделать это через жопу, а то по-другому я не знаю пока как! -Во, берешь знач расширитель диаметром больше твоей руки в локте и... -Блин, Исандро, опять костыли, ТС, попробуй через рот, удобнее, быстрее, проще. -Сам ты костыль, скунс. Это решение через жопу, как и хотел ТС.
Не за чем парсить весь XML документ и выстраивать DOM в памяти, чтобы достать лишь одни тайтлы. http://habrahabr.ru/post/171667/
1) Если xmlка не весит 10 метров, то не много-то в память и уйдет. 2) Вангую, не ради только тайтлов ТС затеял это дело, просто решил спросить как сделать что-то одно, а там остальное по аналогии сам сделает. 3) Если xmlka весит таки 10 метров, то, боюсь, регулярка может выйти накладнее, чем интерпретация в объект. 4) xpath.
Выбрать все символы между <title> и </title>, как и между другими тегами, всяко быстрей и менее накладней по ресурсам, чем полный парсинг с выстраиванием структуры, а потом ещё разбор результата XPath. А тут одна регулярка и - Ибо задача всего лишь
Хе. Если вообще не хочется загружать файл в память Код (PHP): <?php header('Content-Type: text/plain'); $searchTag = 'title'; $titles = array(); $titleN = 0; $file = fopen('xml.xml', 'r'); if($file !== false){ $tstart = microtime(true); while(!feof($file)){ $s = fread($file, 1); if($s == '<'){ $s2 = fread($file, 5); if($s2 == $searchTag){ $s3 = fread($file, 1);// > $stop = false; while(!feof($file) && !$stop){ $s4 = fread($file, 1); if($s4 == '<'){ $s5 = fread($file, 1); if($s5 == '/'){ $s6 = fread($file, 5); if($s6 == $searchTag){ $stop = true; $titleN ++; } }else{ $s4 .= $s5; } } if(!$stop){ if(isset($titles[$titleN])){ $titles[$titleN] .= $s4; }else{ $titles[$titleN] = $s4; } } } //echo "yes!\n"; } } } $tend = microtime(true); echo number_format($tend-$tstart,'4',',','').' sec. '; fclose($file); } var_dump($titles); Так память вообще минимально ест. Но очень медленно. На любителя так сказать.
Вот в 2-3 раза медленней вариант, чем с регулярками, но не загружающий файл в память Код (PHP): $tagStart = '<title>'; $tagStartLen = strlen($tagStart); $tagEnd = '</title>'; $titles = array(); $titleN = 0; define('StateSearch', 1); define('StateTagStart', 2); $state = StateSearch; $file = fopen('xml.xml', 'r'); if($file !== false){ $tstart = microtime(true); while(!feof($file)){ $line = fgets($file); switch($state){ case StateSearch: if(($pos1 = strpos($line, $tagStart)) !== false){ $state = StateTagStart;// нашли тег, проходим дальше $line = mb_substr($line, $pos1 + $tagStartLen);// отстригли начало строки с тегом }else{ break; } case StateTagStart: if(($pos2 = strpos($line, $tagEnd)) !== false){// нашли закрывающий тег $line = mb_substr($line, 0, $pos2); if(isset($titles[$titleN])){ $titles[$titleN] .= $line; }else{ $titles[$titleN] = $line; } $titleN ++; $state = StateSearch; }else{// не нашли конец. ждать до следующей строки if(isset($titles[$titleN])){ $titles[$titleN] .= rtrim($line); }else{ $titles[$titleN] = rtrim($line); } } break; } } $tend = microtime(true); echo number_format($tend-$tstart,'4',',','').' sec. '; fclose($file); } echo 'count($titles):',count($titles), "\n"; XML в 12.3 Mb обрабатывает за 0.61 сек. Вариант с регуляркой обрабатывает за 0.21 сек. Вариант с simplexml_load_file только загружает файл за 0.62 сек. Сколько добавят XPath и последующий разбор - пусть Fell-x27 разбирается.
Загони своего сферического коня обратно в вакуумное стойло. ТС живет в реальном мире и парсит ATOM, это аналог RSSки. Ты хоть гигабайтовые файлы обсчитывай, но тут-то речь идет о n-килобайтовой простынке.