2009-08-09 33 views
2

這是我到目前爲止有:PHP的preg_replace()上的多個項目

<?php 
$text = preg_replace('/((\*) (.*?)\n)+/', 'awesome_code_goes_here', $text); 
?> 

我成功的格式相匹配的純文本列表:

* list item 1 
* list item 2 

我想其替換爲:

<ul> 
    <li>list item 1</li> 
    <li>list item 2</li> 
</ul> 

我不能讓我的頭周圍包裹<ul>並通過<li>循環小號!任何人都可以幫忙嗎?

編輯:解決方案如下回答...

我的代碼,原先爲:

$text = preg_replace('/\* (.*?)\n/', '<ul><li>$1</li></ul>', $text); 
$text = preg_replace('/<\/ul><ul>/', '', $text); 

這做到了!

回答

3

一種方法是簡單地用<ul><li>list item X</li></ul>替換每個列表項,然後運行第二個替換項,它將替換任何一個</ul><ul>

+0

這樣做,謝謝!用新代碼更新的問題 – 2009-08-09 22:41:25

0

我不是正則表達式的專家,但是你要做的就是將你擁有的模式匹配起來,並通過用()的方式圍繞期望的模式將其捕獲到反向引用中。然後,您可以將$ 1(第一個反向引用等)在您的「真棒代碼段」

Regex buddy對正則表達式真的,真的真棒教程,如果你需要更多的

+0

我有1美元等工作的單一比賽,但我希望包圍所有比賽輸出,然後增加輸出每場比賽。 感謝您的鏈接! – 2009-08-09 22:33:01

0

您可以使用preg_match_all來匹配所有項目,然後在ul和li標籤中重寫它們。

0

我想這是你想要的

<?php 

$text = <<<TEXT 
* item 
* item 
TEXT; 

$html = preg_replace("/^\\* (.*)$/m", "<li>\\1</li>", $text); 

echo '<ul>', $html, '</ul>'; 
+0

謝謝!但名單被埋在一個巨大的字符串中 – 2009-08-09 22:44:42

2

我知道這是舊的文章 - 但它需要一個解決方案。嘗試這個! :)

$text = preg_replace("/\[ul\](.*)\[\/ul\]/Usi", "<ul>\\1</ul>", $text); 
$text = preg_replace("/\[li\](.*)\[\/li\]/Usi", "<li>\\1</li>", $text);