4

我有这样的html:

  <ul id="video-tags">
            <li><em>Tagged: </em></li>
                    <li><a href="/tags/sports">sports</a>, </li>
                            <li><a href="/tags/entertain">entertain</a>, </li>
                            <li><a href="/tags/funny">funny</a>, </li>
                            <li><a href="/tags/comedy">comedy</a>, </li>
                            <li><a href="/tags/automobile">automobile</a>, </li>
                    <li>more <a href="/tags/"><strong>tags</strong></a>.</li>
  </ul>

如何将体育、娱乐、搞笑、喜剧、汽车提取成字符串

我的 php preg_match_all 看起来像这样:

preg_match_all('/<a href\="\/tags\/(.*?)\">(.*?)<\/a>, <\/li>/', $this->page, $matches);
echo var_dump($matches);    
echo implode(' ', $tags);  

这没用。

4

3 回答 3

4

我不确定您是如何获得$this->page的,但是以下内容应该可以按您的预期工作:

http://ideone.com/KhWkEg

<?php
$page = 'subject string ...';

preg_match_all('/<a href\="\/tags\/(.*?)\">(.*?)<\/a>, <\/li>/', $page, $matches);

echo implode(', ', $matches[1]);  
?>

只要它仍然是一个字符串,就$page用你的变量替换它。$this->page

但是,我建议不要尝试使用正则表达式解析 HTML。相反,请使用PHP DOM 文档SimpleHTMLdom 之类的库来正确解析 HTML。

于 2012-12-25T18:37:54.433 回答
2

这个小正则表达式也做同样的事情

preg_match_all('|tags/[^>]*>([^<]*)|', $str, $matches);

也使用 DOMDocuemnt。

$d = new DOMDocument();
$d->loadHTML($str);
$as = $d->getElementsByTagName('a');
$result = array();
for($i=0;$i<($as->length-1); $i++)
    $result[]=$as->item($i)->textContent;

echo implode(' ', $result);  
于 2012-12-25T18:44:38.770 回答
1

这对我来说非常有效:

preg_match_all('/<a href\="\/tags\/(.*?)\">.*?<\/a>, <\/li>/', $str, $matches);
echo implode(',', $matches[1]);

印刷品:体育、娱乐、搞笑、喜剧、汽车

$this->page 可能是空的,这就是你没有得到任何数据的原因。

为什么在正则表达式中两次放置方括号?您在链接的 url 和文本中都有相同的词。

于 2012-12-25T18:30:53.390 回答