限制为仅使用PHP标记的帖子

我试图只获得在tumblr博客上标记的帖子.我可以根据帖子的类型(常规,链接,照片等)来获取每个帖子,但我想获取每个带有特定标签的帖子.例如,仅获取标记为“文件”的帖子

到目前为止,这是我的代码:

<?php
    $xml = simplexml_load_file('http://stocklamp.tumblr.com/api/read');
    $posts = $xml->xpath("/tumblr/posts/post[@type='photo']");
    foreach($posts as $post) {  

        }
    ?>

    <ul>
        <li> <a href="<?php echo $post['url-with-slug']; ?>">Post 1(PHP should be here)</a></li>
    </ul>

这是tumblrs API http://www.tumblr.com/docs/en/api/v2

解决方法:

首先,您需要将标记放在属于foreach循环的大括号内.否则,您所引用的$post对象的范围将不可用,并且会给您一个错误.

这是我想出的:

<ul>
<?php

$xml = simplexml_load_file('http://stocklamp.tumblr.com/api/read');
$posts = $xml->xpath("/tumblr/posts/post/tag/..");
foreach($posts as $post) {
    echo "
  <li>
   <a href='{$post['url-with-slug']}'>".($post->{'regular-title'}?$post->{'regular-title'}:$post->{'link-text'})."</a>
  </li>
";
}

?>
</ul>

如果要限制匹配的标签,可以执行以下操作:

<ul>
<?php

$xml = simplexml_load_file('http://stocklamp.tumblr.com/api/read');
$posts = $xml->xpath("/tumblr/posts/post/tag[contains(text(),'xml') or contains(text(),'php') or contains(text(),'firefox')]/..");
foreach($posts as $post) {
    echo "
  <li>
   <a href='{$post['url-with-slug']}'>".($post->{'regular-title'}?$post->{'regular-title'}:$post->{'link-text'})."</a>
  </li>
";
}

?>
</ul>

当然,这有点混乱.我不一定是XPath专家,所以应该有一种比我想象的更干净的方法.

而且由于我并不是真的在研究链接文本的三元数,或者我不知道一个或另一个是否总是可用,所以这应该是更具描述性的,并使用备用网址.

<ul>
<?php

$xml = simplexml_load_file('http://stocklamp.tumblr.com/api/read');
$posts = $xml->xpath("/tumblr/posts/post/tag[contains(text(),'xml') or contains(text(),'php') or contains(text(),'firefox')]/..");
foreach($posts as $post) {
    if ($post->{'regular-title'}) {
        $slug = $post->{'regular-title'};
    } else if ($post->{'link-text'}) {
        $slug = $post->{'link-text'};
    } else {
        $slug = $post['url-with-slug'];
    }
    echo "
  <li>
   <a href='{$post['url-with-slug']}'>".$slug."</a>
  </li>
";
}

?>
</ul>

编辑

而且,您可能还想匹配TAG元素的整个文本,这样,当您只需要xml标签时,就不会在xml-is-for-noobs之类的内容上获得匹配. contains()将同时匹配两者,而以下仅匹配xml.

/tumblr/posts/post/tag[text() = 'xml']/..

因此,根据您的评论,如果您要查找带有标记事件的帖子,但又不想捕获诸如保龄球事件,阻止娱乐,其他事件等之类的标记,则希望使text()= “赛事”比赛.另一方面,如果DID想要使任何内容与TAG节点文本中的事件匹配,请使用contains(text(),’events’)方法.

编辑2

如果要限制结果,请使用position():

(/tumblr/posts/post/tag[text() = 'xml']/..)[position() <= 3]

请注意,我网页上的示例不包含text()匹配项,因为没有足够的条目来支持子匹配项并且仍然有效.但是,那应该起作用.

http://jfcoder.com/test/tumblrtest.php

XPath选择属于POST元素的所有TAG元素,然后选择该TAG的父级(..),这将为您提供一个SimpleXML对象,其中包含要查找的相关POST元素.

然后,迭代每个元素,将$post的信息打印到UL元素中.

上一篇:PHP simplexml_load_string() 函数


下一篇:六安办六安证Ddowp