所以我的数据库中有大量条目,其中输入了列表,但它们不是真正的列表,我需要将它们转换为实际列表。
这就是我所拥有的:
Other HTML data here.
<p>ñ Line of data</p>
<p>ñ Another line of data</p>
<p>ñ Yet another line of data</p>
<p>ñ 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解析器。没有真正感兴趣的另一个,但如果有一个非常容易使用,将照顾这将有用。
再次感谢。
答案 0 :(得分:3)
我将因不使用DOM解析器而受到谴责,但现在就去了。这只是一个简单的字符串操作,不需要正则表达式。
您只需将<p>
打开/关闭代码替换为<li>
打开/关闭代码,并将其打包在<ul></ul>
中。
已更新已修复以解决问题更新,以及之前的内容列表后......:
$original = "Stuff here
<p>ñ Line of data</p>
<p>ñ Another line of data</p>
<p>ñ Yet another line of data</p>
<p>ñ 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>ñ ", "<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>ñ FIRST LIST ITEM</p>
<p>ñ MIDDLE LIST ITEM</p>
<p>ñ LAST LIST ITEM</p>
<p>STUFF AFTER</p>";
echo make_real_list("/\<p\>ñ (.*?)\<\/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>