如何多次解析html标签? PHP

时间:2014-05-03 20:43:47

标签: php html

字符串我正在尝试解析。

<b>Genre:</b> <a href="http://store.steampowered.com/genre/Action/?snr=1_5_9__408">Action</a>, <a href="http://store.steampowered.com/genre/Adventure/?snr=1_5_9__408">Adventure</a>, <a href="http://store.steampowered.com/genre/Casual/?snr=1_5_9__408">Casual</a>, <a href="http://store.steampowered.com/genre/Early%20Access/?snr=1_5_9__408">Early Access</a>, <a href="http://store.steampowered.com/genre/Indie/?snr=1_5_9__408">Indie</a>, <a href="http://store.steampowered.com/genre/RPG/?snr=1_5_9__408">RPG</a><br>

我想要实现的目标(没有所有其他标签等):

Action Adventure Casual Early Access Indie RPG

这是我尝试过的事情

        function getTagInfo($content,$start,$end){
            $r = explode($start, $content);
            if (isset($r[1])){
                $r = explode($end, $r[1]);
                return $r[0];
            }
            return '0';
        }


 getTagInfo($html, '/?snr=1_5_9__408">', '</a>');

并且只给了我一种类型,我想不出一个能够解析其余类型的算法,那么我怎样才能解析其他行呢?

5 个答案:

答案 0 :(得分:1)

你可以在这里使用正则表达式:

<a.*?>(.*?)</a>

此RegExp将返回所有<a></a>个对象。

试试这个PHP代码:

preg_match(/<a.*?>(.*?)<\/a>/, $htmlString, $matches);

foreach($matches as $match) {
    echo $match . " <br /> "; 
}

这将输出:

Action 
Adventure 
Casual 
Early 
Access 
Indie 
RPG

答案 1 :(得分:1)

您可以使用另一个stackoverflow线程中的此代码。

PHP/regex: How to get the string value of HTML tag?

 <?php
function getTextBetweenTags($string, $tagname) {
    $pattern = "/<$tagname ?.*>(.*)<\/$tagname>/";
    preg_match($pattern, $string, $matches);
    return $matches[1];
}

$str = '<textformat leading="2"><p align="left"><font size="10">get me</font></p></textformat>';
$txt = getTextBetweenTags($str, "font");
echo $txt;
?>

答案 2 :(得分:1)

您可以使用preg_match_all

$regex = '/<a.*?>(.*?)<\/a>/is';
preg_match_all($regex, $html, $matches);

$matches[1]将是锚标记之间的内容数组,您可以像这样迭代它:

foreach ($matches[1] as $match)
{
  echo $match .'<br>';
}

使用实际的HTML parser可能会更好,因为HTML不是regualr语法。

答案 3 :(得分:1)

您可以尝试这样的事情(DEMO):

function getTagInfo($html)
{
    if( preg_match_all('/<a href=\"(.*?)\">/i', $html, $matches)) {
        $result = array();
        foreach($matches[1] as $href) {
            $array = explode('/', $href);
            $arr = $array[count($array) - 2];
            $result[] = urldecode($arr);
        }
        return $result;
    }
    return false;
}

// Get an array
print_r(getTagInfo($html));

输出:

Array ( 
    [0] => Action 
    [1] => Adventure 
    [2] => Casual 
    [3] => Early Access 
    [4] => Indie 
    [5] => RPG 
)

答案 4 :(得分:0)

我可能也会用REGEX来做这件事,但由于已有4个有REGEX答案的帖子,我会抛出另一个想法。这可能过于简单,但您可以使用strip_tags删除任何HTML标记。

$string = '<b>Genre:</b> <a href="http://store.steampowered.com/genre/Action/?snr=1_5_9__408">Action</a>, <a href="http://store.steampowered.com/genre/Adventure/?snr=1_5_9__408">Adventure</a>, <a href="http://store.steampowered.com/genre/Casual/?snr=1_5_9__408">Casual</a>, <a href="http://store.steampowered.com/genre/Early%20Access/?snr=1_5_9__408">Early Access</a>, <a href="http://store.steampowered.com/genre/Indie/?snr=1_5_9__408">Indie</a>, <a href="http://store.steampowered.com/genre/RPG/?snr=1_5_9__408">RPG</a><br>';

print strip_tags($string);

这将返回以下内容:

Genre: Action, Adventure, Casual, Early Access, Indie, RPG

无论如何,这可能不是我去做的方式,但它是一个非常容易实现的单线程。

我估计,你也可以将前面的一些REGEX结合起来,将它变成你正在寻找的数组:

$string_array = preg_split('/,\s*/', preg_replace('/Genre:\s+/i', '', strip_tags($string)));

print_r($string_array);

这将为您提供以下内容:

Array
(
    [0] => Action
    [1] => Adventure
    [2] => Casual
    [3] => Early Access
    [4] => Indie
    [5] => RPG
)
哈,对不起......无论如何最终还是把REGEX扔进了答案。但它仍然是一个单行。 :)