使用preg_replace清理小部件输出HTML


Using preg_replace to clean widget output HTML

我正在开发一个使用插件/侧边栏小部件的wordpress网站。我遇到的问题是小部件生成的HTML无效,下面是一个例子。。。

<p>
<div>I am item 1</div>
<div>I am item 2</div>
<div>I am item 3</div>
<div>I am item 4</div>
<p></p>

根据我的理解,这段代码有两个错误,第一个是它在段落中使用了div(块级元素)。第二个是有一个额外的P标签,它在末尾没有闭合。

我已经和小部件开发人员谈过了,尽管这是一个昂贵且付费的插件,但我并不急于解决这个问题。

我将尝试使用preg_replace来清理代码,我想知道是否有人有这样做的示例或教程,并且只针对小部件容器中的代码?

首先,当我看到您的数据(项目列表)时,我认为<ul> <li>会更好:

<ul>
<li>I am item 1</li>
<li>I am item 2</li>
<li>I am item 3</li>
<li>I am item 4</li>
</ul>

对于你的怀孕,如果你只是简单地使用str_replace(不那么昂贵),那就更好了

str_replace(array("<div>","</div>","<p>","</p>"), array("<li>","</li>","<ul>","</ul>"),$yourHtml)

然后通过str_replace("<ul></ul>", "",$yourHtml) 删除空的<p></p>(现在的<ul></ul>

但更好的解决方案是自己编辑插件并定义不同的输出!


不过,另一个"更好"的解决方案是使用preg_match_all获取数组中的所有项。

示例:

$html="<p>
<div>my item 1</div>
<div>my item 2</div>
<div>my item 3</div>
<p></p>";
preg_match_all("#<div>(.*)</div>#",$html,$matchs);
var_dump($matchs[1]);
//var_dump output : array(3) { [0]=> string(9) "my item 1" [1]=> string(9) "my item 2" [2]=> string(9) "my item 3" }

如果<div>中没有<div>(我的意思是:<div> my <div>item 1</div></div>),则此代码可以正常工作。

通过这种方式,您可以在一个数组中获得所有数据,并且它们更容易操作。我不知道你的php学位,但只是执行一个foreach循环

   foreach($matchs[1] as $v){
      //$v is one item
   }