在Php/HTML中的无序列表

3
我正在尝试让字符串中的星号表示无序列表中的列表元素。
    $first_char = substr($p,0,1);
    if($first_char == '*'){
        $p = '<ul>' . $p . '</li></ul>';
        $p = str_replace('*' , '<li>',$p);
        $p = str_replace('\n' , '</li>',$p);
    }

但是,如果这样使得列表元素中不能使用星号作为内容。有没有办法改变这种情况?


也许您可以使用字符组合来表示列表项。不确定这对您的情况有多大帮助,但可以看一下 Markdown。它是一个很好的文本到 HTML 转换器。 - Petet
你可以尝试一下将你的PHP代码(用于创建像上面那样的列表项),然后使用CSS中的“content”属性将“li”节点转换为星号。我之前写的内容并不是对你直接问题的回答,所以我已经删除了它。如果你想深入了解这个问题,可以参考这里提供的有用信息:https://dev59.com/J2sz5IYBdhLWcg3wuKa6#12216973 - nomistic
3个回答

2

正则表达式替换方案

<?php

$pattern = '/(?:^|\n)\s*\*[\t ]*([^\n\r]+)/';
$replacement = '<li>${1}</li>';
$count = 0;

$p = preg_replace($pattern, $replacement, $p, -1, $count);

if ($count > 0) {
    $pattern = '/(<li>.*?(?:<\/li>)(?:\s*<li>.*?(?:<\/li>))*)/';
    $replacement = '<ul>${1}</ul>';

    $p = preg_replace($pattern, $replacement, $p);
}
?>

测试字符串

* Lorem ipsum dolor sit amet, * consec*tetur adipiscing elit
    *Curabitur ullamcorper neque sit amet

 *  Pellente*sque nec quam rhoncus
Suspendisse ut lacinia arcu

* Nullam in vulpu*tate tellus

输出

<ul><li>Lorem ipsum dolor sit amet, * consec*tetur adipiscing elit</li>
<li>Curabitur ullamcorper neque sit amet</li>
<li>Pellentesque nec quam rhoncus</li></ul>
Suspendisse ut lacinia arcu
<ul><li>Nullam in vulputate tellus</li></ul>

PHP手册 - preg_replace函数


1
这是简单的方法:
if(substr($p,0,1) == '*'){
    $p = '<ul>' . substr($p,1) . '</ul>;
}

1
这可能不是最佳解决方案,但您可以在字符串($p)中不使用*。相反,将每个星号写成其HTML代码等效项,例如&#42;。当在浏览器中显示时,用户看到的是漂亮的星号,但str_replace不应该看到它。或者您可以引入一些转义字符,但那可能会有些复杂。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接