PHP:使用Preg_match_all将HTML提取为字符串

4

I have html like this:

  <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);  

它不能工作。

1
它为什么“不能工作”?你得到什么?错误?与你所期望的不同的字符串?它在做什么(或者没有做什么)?$tags 应该是什么,它在哪里设置? - PenguinCoder
我的 var_dump 看起来像这样: array(3) { [0]=> array(0) { } [1]=> array(0) { } [2]=> array(0) { } } - Redbox
我期望在数组或字符串中看到类似于体育、娱乐、有趣、喜剧、汽车展的内容。 - Redbox
https://dev59.com/X3I-5IYBdhLWcg3wq6do - shark555
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。


2

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

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

同样也可以使用DOMDocument。
$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);  

1

这对我来说完美地解决了问题:

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

分类:体育、娱乐、搞笑、喜剧、汽车

$this->page 可能为空,因此您没有获得任何数据。

为什么在正则表达式中将括号重复两次?您在网址和链接文本中都有相同的单词。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接