为最后一次出现的异常替换字符串中的项目

Replace items in the string for the exception of the last occurance

我有以下代码,它从我的 wordpress 博客中获取类别,并用管道替换所有换行符。

<?php $variable = wp_list_categories('style=none&echo=0'); ?>
<?php $variable = str_replace('<br />', ' | ', $variable); ?>
<?php echo $variable; ?>

代码有效 - 但我需要忽略最后一次出现的情况。 有什么解决办法吗?

谢谢!

试试 rtrim()。它将从字符串中删除最后一个 |

echo rtrim($variable, '|');

更新

$str = "hhh|yyy|YY|ll";
$last = strrpos($str, '|');
$part = rtrim(substr($str, 0, $last), '|');
if($last < strlen($str))
    $part .= substr($str, $last + 1), (strlen($str) -$last));

echo $part;

str_replace 与类别变量一起使用时 return 类别 | 管道在类别名称

之前用 space 分隔

所以你可以删除最后两个字符,一个是 space,第二个是 | 管道。

$variable = wp_list_categories('style=none&echo=0'); 
$variable = str_replace('<br />', '|', $variable);
var_dump($variable);
echo substr($variable,0,strlen($variable)-2);

如果您在类别名称前后使用带 space 的管道,则使用 -4 代替 -2

另一种方法是使用 strrpos 获取最后一个竖线 | 字符,一旦找到,只需使用字符串索引将其删除,然后使用 substr_replace 并将其替换为再次 <br/>

$variable = str_replace(array('<br/>', '<br />', '<br>'), '|', $variable);
$last_pipe = strrpos($variable, '|');
if($last_pipe !== false) {
    $variable[$last_pipe] = ''; // remove
    $variable = substr_replace($variable, '<br/>', $last_pipe, 0); // replace
}
echo $variable;

Sample Output

旁注:这将是一个肮脏的解决方案,但如果你有更复杂的操作要完成,最好只使用 HTML 解析器,DOMDocument特别是与 ->replaceChild 结合回归。

$dom = new DOMDocument;
$dom->loadHTML($variable, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$br_tags = $dom->getElementsByTagName('br');
$i = $br_tags->length - 2; // -2 to leave the last one conversion
while($i > -1) {
    $br = $br_tags->item($i);
    $pipe = $dom->createTextNode('|');
    $br->parentNode->replaceChild($pipe, $br);
    $i--;
}

echo $dom->saveHTML();

Sample Output