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);
    }

但是,如果这样做,则不会将星号用作列表元素中的内容。有什么办法可以改变这个吗?

4

3 回答 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

于 2015-05-01T23:41:30.583 回答
1

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

于 2015-05-01T23:32:43.140 回答
1

这是简单的方法:

if(substr($p,0,1) == '*'){
    $p = '<ul>' . substr($p,1) . '</ul>;
}
于 2015-05-01T23:49:52.100 回答