2017-08-29 10 views
1

3つの列に分割する必要がある長い順序のないリスト(<ul>)があります。私はこのようなものがあります:文字列のn番目の単語/要素を見つけて置き換えます

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

を...そして今私は$ ULのn番目の要素($ 9月)を見つけて、それを交換する必要があります。

<li>

</ul><ul><li>にEDIT:

マイリスト次のようになります。

<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

。 source_string、replace_string、search_string、 – ManiMuthuPandi

+0

入力したHTMLを貼り付け – delboy1978uk

+0

CSSを使用するだけで問題が解決する場合は、[column-count](https://developer.mozilla.org/ja/docs/Web/CSS/)をご覧ください。列カウント) – iainn

答えて

0

私はこの解決策になってしまった:あなたのhtmlの一部を配置

$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として取り出し、それを3つの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

私はいつもこの場合PHP's DOM classesには、解析のためにネイティブ関数を使用することを好むとHTMLを操作します。

$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

Ok - これは素晴らしいですが、 list要素内のすべてのhtmlタグを削除します。どうすればそれを避けることができますか? – insanebear

関連する問題