找到第 n 个 word/element 的字符串并替换它
Find nth word/element of string and replace it
我有很长的无序列表 (<ul>
),我需要将其分成三列。我有这样的东西:
$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>
这将得到一个无序列表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);
我总是更喜欢使用本机函数来解析和操作 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>
我最终得到了这个解决方案:
$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>';
我有很长的无序列表 (<ul>
),我需要将其分成三列。我有这样的东西:
$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>
这将得到一个无序列表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);
我总是更喜欢使用本机函数来解析和操作 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>
我最终得到了这个解决方案:
$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>';