如何使用PHP解析内容以使用真实列表替换虚假列表?

时间:2011-09-02 14:34:57

标签: php preg-replace preg-match

  

可能重复:
  Best methods to parse HTML with PHP

所以我的数据库中有大量条目,其中输入了列表,但它们不是真正的列表,我需要将它们转换为实际列表。

这就是我所拥有的:

Other HTML data here.

<p>&ntilde; Line of data</p>
<p>&ntilde; Another line of data</p>
<p>&ntilde; Yet another line of data</p>
<p>&ntilde; Still more data</p>

More HTML data here.

需要改为:

Other HTML data here.

<ul>
    <li>Line of data</li>
    <li>Another line of data</li>
    <li>Yet another line of data</li>
    <li>Still more data</li>
</ul>

More HTML data here.

它不必像那样格式化,可以全部粉碎在一起。我不在乎。

感谢。


忘记提及列表的两边都有HTML数据。

我也有SimpleDOM解析器。没有真正感兴趣的另一个,但如果有一个非常容易使用,将照顾这将有用。

再次感谢。

3 个答案:

答案 0 :(得分:3)

我将因不使用DOM解析器而受到谴责,但现在就去了。这只是一个简单的字符串操作,不需要正则表达式。

您只需将<p>打开/关闭代码替换为<li>打开/关闭代码,并将其打包在<ul></ul>中。

已更新已修复以解决问题更新,以及之前的内容列表后......:

$original = "Stuff here

<p>&ntilde; Line of data</p>
<p>&ntilde; Another line of data</p>
<p>&ntilde; Yet another line of data</p>
<p>&ntilde; Still more data</p>

Other stuff";

// Store stuff before & after the list
$stuffbefore = substr($original, 0, stripos($original, "<p>"));
$stuffafter = substr($original, strripos($original, "</p>") + strlen("</p>"));

// Cut off the stuff before the list
$listpart = substr($original, strlen($stuffbefore));
// Cut off stuff after the list
$listpart = substr($listpart, 0, strlen($listpart) - strlen($stuffafter));

$fixed = str_replace("<p>&ntilde; ", "<li>", $listpart);
$fixed = str_replace("</p>", "</li>", $fixed);

// Stick it all back together
$fixed = "$stuffbefore\n<ul>$fixed</ul>\n$stuffafter";

答案 1 :(得分:0)

你可以使用 Str_replace 将所有<p>替换为<li>的位置 和所有</p></li>

答案 2 :(得分:0)

<强>更新 我已经遇到过这个问题,之前有一堆数据带有'假'列表使用缩进和不同的字符作为子弹,所以我只是做了这个小功能。

function make_real_list($regex, $content, $type="unordered"){

    preg_match_all($regex, $content, $matches);

    $matches    = $matches[0];
    $count  = sizeof($matches);

    if($type=="unordered"):
        $outer_start    = "<ul>";
        $outer_end      = "</ul>";

    else:
        $outer_start    = "<ol>";
        $outer_end      = "</ol>";

    endif;

    $i = 1;
    foreach($matches as $match):

        if($i==1):
            $replace    = preg_replace($regex, '<li>$1</li>', $match, 1);
            $match  = preg_quote($match, "/");
            $content    = preg_replace("/$match/", ($outer_start?$outer_start:'').$replace, $content);

        elseif($i==$count):
            $replace    = preg_replace($regex, '<li>$1</li>', $match, 1);
            $match  = preg_quote($match, "/");
            $content    = preg_replace("/$match/", $replace.($outer_end?$outer_end:''), $content);

        else:
            $content    = preg_replace($regex, '<li>$1</li>', $content, 1);

        endif;
        $i++;

    endforeach;

    return $content;

}

$content = "<p>STUFF BEFORE</p>
<p>&ntilde; FIRST LIST ITEM</p>
<p>&ntilde; MIDDLE LIST ITEM</p>
<p>&ntilde; LAST LIST ITEM</p>
<p>STUFF AFTER</p>";

echo make_real_list("/\<p\>&ntilde; (.*?)\<\/p\>/", $content);

//OUTPUT
<p>STUFF BEFORE</p> 
<ul>
    <li>FIRST LIST ITEM</li> 
    <li>MIDDLE LIST ITEM</li> 
    <li>LAST LIST ITEM</li>
</ul> 
<p>STUFF AFTER</p>