2012-07-24 17 views
3

我正在使用插件/側欄小部件的wordpress網站上工作。我遇到的問題是,小部件生成HTML是無效的,這樣的一個例子是下面...使用preg_replace清理小部件輸出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> 

從我的理解有兩個錯誤的代碼,第一個是它使用段落內的塊(塊級元素)。第二個是有一個額外的P標籤,最後沒有關閉。

我已經和小部件開發人員談過了,即使它是一個昂貴的付費插件,也不急於解決問題。

我將嘗試使用preg_replace清理代碼,我想知道是否有人有任何示例或教程來做到這一點,並只針對小部件容器內的代碼?

+0

一個快速提示:有這個網站,你可以不斷地嘗試:http://gskinner.com/RegExr/ – xdbas 2012-07-24 22:53:47

回答

3

首先,當我看到你的DATAS(產品清單),我想<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> 

爲了您的preg_replace它甚至更好,如果你只是使用str_replace函數(少exepensive)

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

然後你刪除空<p></p>(現<ul></ul>)由str_replace("<ul></ul>", "",$yourHtml)

但甚至更好的解決方案是自己編輯插件並定義不同的輸出!


雖然之後,其他的「更好」的解決辦法是獲得與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 
    } 
+0

我有問題該插件只是將選項發送到生成HTML代碼的API並將其返回給插件。這意味着我無法控制它生成的HTML代碼。我將嘗試並實施您的解決方案,看看它是如何發展的,感謝您的輸入到目前爲止 – fightstarr20 2012-07-24 23:21:46

+0

如果API每個月都沒有改變他的輸出,這個「解決方案」將會很好,但這不是一個沉重的解決方案。如果你想更多的看我的答案:我編輯並添加了其他解決方案。 – troc 2012-07-25 08:37:14