2012-12-25 27 views
4

我有HTML這樣的:PHP:Preg_match_all提取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); 

它不起作用。

+1

它如何「不起作用」?你有什麼?錯誤?與你期望的字符串不同?它在做什麼(或不做)? '$ tags'應該是什麼,它在哪裏設置? – PenguinCoder

+0

我的var_dump看起來像這樣: array(3){[0] => array(0){} [1] => array(0){} [2] => array(0){}} – Redbox

+0

im expect如:體育,娛樂,搞笑,喜劇,汽車顯示內部數組或字符串 – Redbox

回答

3

我不知道你怎麼是從,而下面的工作應該得到$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只要它仍然是一個字符串。我想建議not trying to parse HTML with Regular Expressions。相反,請使用類似PHP DOM documentSimpleHTMLdom的庫來正確解析HTML。

+0

工作正常。謝謝。 – Redbox

1

這完美地工作對我來說:

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

打印:體育,娛樂,搞笑,喜劇,汽車

$這個 - >頁可能是空的,這就是爲什麼你沒有得到任何數據。

爲什麼你在正則表達式中放置括號兩次?您在鏈接的網址和文字中都有相同的字詞。

2

這個小正則表達式does the same thing也是。

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