- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我试图只获取在 tumblr 博客上标记的帖子。我可以根据帖子的类型(常规、链接、照片等)获取每个帖子,但相反,我想获取每个帖子上都有特定的标签。例如,只获取标记为"file"的帖子
到目前为止,这是我的代码:
<?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 大师,所以应该有比我想象的更简洁的方法。
而且由于我并没有真正挖掘链接文本的三元组,或者我不知道一个或另一个是否总是可用的事实,所以这应该通过 url 的后备更具描述性。
<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-is-for-noobs 之类的内容
当您只需要 xml
标签时。 contains()
将匹配两者,而 below 将仅匹配 xml
。
/tumblr/posts/post/tag[text() = 'xml']/..
因此,根据您的评论,如果您正在寻找标记为 events
的帖子,但不想捕获像 bowling-events
这样的标签, 可以防止fun
、other events
等...,您可能希望使 text() = 'events'
匹配。另一方面,如果您 DID 想要匹配 TAG
节点文本中的任何内容与 events
,请使用 contains(text(), 'events' )
方法。
编辑 2
如果您想限制结果,请使用 position()
:
(/tumblr/posts/post/tag[text() = 'xml']/..)[position() <= 3]
请注意,我网页上的示例不包括 text()
匹配,因为没有足够的条目来支持子匹配并仍然有效。但是,这应该有效。
http://jfcoder.com/test/tumblrtest.php
XPath 选择属于 POST
元素的所有 TAG
元素,然后选择该 的父级 (
,它为您提供一个 SimpleXML 对象,其中包含您要查找的相关 ..
) TAGPOST
元素。
然后,它遍历每个元素,将 $post
的信息打印到 UL
元素中。
关于php - 仅限于使用 PHP 标记的帖子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6801539/
我是一名优秀的程序员,十分优秀!