2017-08-29 74 views
1

我有很長的無序列表(<ul>),我需要分成三列。我有這樣的事情:找到第n個字/元素的字符串,並將其替換爲

$num = substr_count($ul, '<li>')/3; 
$sep = round($num, 0); 

...現在我需要找到$ ul的第n個元素($ sep)並將其替換。

<li></ul><ul><li>

編輯:

我的名單看起來就像這樣:

<ul> 
<li>1</li> 
<li>2</li> 
<li>3</li> 
<li>4</li> 
<li>5</li> 
<li>6</li> 
</ul> 

...,我想是這樣的:

<ul> 
<li>1</li> 
<li>2</li> 
</ul> 
<ul> 
<li>3</li> 
<li>4</li> 
</ul> 
<ul> 
<li>5</li> 
<li>6</li> 
</ul> 
+0

地方你的HTML部分; source_string,replace_string,search_string, – ManiMuthuPandi

+0

粘貼您的輸入HTML – delboy1978uk

+0

如果您只能使用CSS,那麼請查看[column-count](https://developer.mozilla.org/en/docs/Web/CSS/列計數) – iainn

回答

0

我結束了此解決方案:

$ul = '<ul><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li></ul>'; 

$doc = new DOMDocument(); 
$doc->loadHTML('<?xml encoding="UTF-8">' . $ul); 
$liList = $doc->getElementsByTagName('li'); 
$liValues = array(); 
foreach ($liList as $li) { 
    $liValues[] = $li->c14n(); 
} 

$num = count($liValues)/3; 
$size = round($num+1); 

$i = 0; 
$list = ''; 

foreach ($liValues as $listItem) { 

    if ($i !== 0 && $i % $size === 0) { 
     $list.= '</ul><ul>'; 
    } 

    $list.= $listItem; 

    $i++; 
} 

echo '<ul>'.html_entity_decode(str_replace(array('</br>', '</img>'), '', $list)).'</ul>'; 
1

這將得到一個無序列表爲HTML,將其分爲三個UL,然後吐出:

<?php 
$ul = "<ul> 
<li>1</li> 
<li>2</li> 
<li>3</li> 
<li>4</li> 
<li>5</li> 
<li>6</li> 
</ul>"; 
function divideUl($ul) { 
    $ulArray = explode("\n", $ul); 
    array_pop($ulArray); 
    array_shift($ulArray); 
    $num = substr_count($ul, '<li>')/3; 
    $sep = round($num); 
    $string = "<ul>"; 
    foreach ($ulArray as $i => $li) { 
     if ($i % $sep === 0 && $i !== 0) $string .= "</ul>"; 
     if ($i % $sep === 0 && $i !== 0) $string .= "<ul>"; 
     $string .= $li; 
    } 
    $string .= "</ul>"; 
    return $string; 
} 
echo divideUl($ul); 

Demo

2

我總是喜歡使用本地函數解析和操作HTML,在這種情況下PHP's DOM classes

$ul = "<ul><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li></ul>"; 

// Import our existing list 
$input = new DOMDocument; 
$input->loadHTML($ul); 

$output = new DOMDocument; 

$num = substr_count($ul, '<li>')/3; 
$size = round($num); 

$i = 0; 

foreach ($input->getElementsByTagName('li') as $listItem) { 
    // If we've reached our boundary (or are at the start of the list), add a new UL 
    if ($i % $size === 0) { 
     $list = $output->createElement('ul'); 
     $output->appendChild($list); 
    } 

    // Append our list item to the current list 
    $list->appendChild($output->createElement('li', $listItem->nodeValue)); 

    $i++; 
} 

echo $output->saveHTML(); 

// <ul><li>1</li><li>2</li></ul><ul><li>3</li><li>4</li></ul><ul><li>5</li><li>6</li></ul> 
+0

它很棒! utf-8的小解決方法:$ input-> loadHTML(mb_convert_encoding($ ul,'HTML-ENTITIES','UTF-8'));' – insanebear

+0

這比我的更乾淨 – ishegg

+0

好的 - 這個工程很好,但它去除列表元素中的所有html標籤。我如何避免這種情況? – insanebear

相關問題