PHP将自定义标记替换为列表标记

PHP将自定义标记替换为列表标记,php,Php,我有一个数据库表,用于存储产品描述。我希望用户能够插入自定义“[FEATURES]”标记,以便能够快速列出产品的所有功能,或者无需使用WYSIWYG编辑器或编写自己的html。因此,如下图所示,用户将能够像这样指定开始特征标记和结束特征标记列表: [FEATURES] Feature # 1 would go here! Feature # 2 would go here! Feature # 3 would go here! Feature # 4 would go here! Feature

我有一个数据库表,用于存储产品描述。我希望用户能够插入自定义“[FEATURES]”标记,以便能够快速列出产品的所有功能,或者无需使用WYSIWYG编辑器或编写自己的html。因此,如下图所示,用户将能够像这样指定开始特征标记和结束特征标记列表:

[FEATURES]
Feature # 1 would go here!
Feature # 2 would go here!
Feature # 3 would go here!
Feature # 4 would go here!
Feature # 5 would go here!
[/FEATURES]
如上图所示,这是用户指定功能列表的方式,但我希望它们以非有序列表的形式输出,如下所示:

<ul>
<li>Feature # 1 would go here!</li>
<li>Feature # 2 would go here!</li>
<li>Feature # 3 would go here!</li>
<li>Feature # 4 would go here!</li>
<li>Feature # 5 would go here!</li>
</ul>
  • 特写#1就在这里
  • 功能#2会放在这里
  • 功能#3会放在这里
  • 功能#4会放在这里
  • 功能#5就放在这里
我希望我可以使用简单的str_replace函数

str_replace("\n", "<li>", $string)
str\u replace(“\n”、“
  • ”、$string)
  • 但我在想如何正确地做到这一点时遇到了困难。 非常感谢您的帮助

    编辑:
    我忘了在那些[FEATURES]标签的外面加上随机描述,我只想要FEATURES列表的输出,而不接受输出上的任何其他描述。所以我认为preg_match_all函数可能是必要的,只是不太确定如何将它们组合在一起。

    解决这个问题有两个部分:

    • 分别用相应的
      替换打开和关闭
      [功能]
    • 处理所有三个可能的新行:
      \n
      \r
      \r\n
    Aaron,这是一个基本的解决方案:

    <?php
    
    $input = <<<INPUT
    [FEATURES]
    Feature # 1 would go here!
    Feature # 2 would go here!
    Feature # 3 would go here!
    Feature # 4 would go here!
    Feature # 5 would go here!
    [/FEATURES]
    INPUT;
    
    // Add basic tags
    $input = str_replace("[FEATURES]", "<ul>", $input);
    $input = str_replace("\r\n", "</li>\n<li>", $input);
    $input = str_replace("[/FEATURES]", "</ul>", $input);
    
    // Clear up tags we don't need
    $input = str_replace("<ul></li>", "<ul>", $input);
    $input = str_replace("<li></ul>", '</ul>', $input);
    
    echo $input;
    

    下面是一个使用正则表达式的解决方案:

    <?php
    $Input = "";
    $Input .= "[FEATURES]\n";
    $Input .= "Fits in pocket\n";
    $Input .= "Waterproof\n";
    $Input .= "2-year warranty\n";
    $Input .= "[/FEATURES]";
    
    $NewInput = preg_replace_callback("~\[FEATURES\]((?:(?!\[/FEATURES\]).)*)\[/FEATURES\]~is",
            function ($Match) {
                return preg_replace("~(?<=[\r\n]|^)([^\r\n]*)(?=[\r\n]|$)~is", "<li>$1</li>", preg_replace("~^\s|\s$~is","",$Match[1]));
            }, $Input??"");
    
    $NewInput = "<ul>\n".$NewInput."\n</ul>";
    
    echo $NewInput;
    
    
    
  • 把绳子分成几行
  • 标记将每行环绕
  • 将所有物品粘在一起,并用
    标签环绕物品
  • 代码:

    echo "<ul>" . implode('', 
        array_map(function ($item){ return '<li>' . $item . '</li>';},
            explode("\n", $string)
        )
    )
    . '</ul>' ;
    
    echo“
      ”。内爆(“”, 数组映射(函数($item){return'
    • '.$item'
    • ';}, 分解(“\n”,$string) ) ) . '
    ';
    等等,我刚刚注意到还有一个问题。假设在[FEATURES]标签的外部有其他文字描述,如下所示:blaaaah blahh blahh[FEATURES]功能列表将放在这里[/FEATURES]blahh blahh(功能标签外部的一些随机描述。我们不是必须进行预匹配或替换吗?@AaronEsteban,只要每个功能都在其自己的行上,它仍然可以工作。
    strpos()
    检查“功能”一词是否正确)出现在行的任何位置否,因为我已经测试过它。如果您将以下内容作为输入进行检查,并在这些功能标签的外部添加说明,则该说明不应包含在最终输出中。我将在下面给您留下一个示例,说明我所指的内容….$fts=
    <ul>
        <li>Feature # 1 would go here!</li>
        <li>Feature # 2 would go here!</li>
        <li>Feature # 3 would go here!</li>
        <li>Feature # 4 would go here!</li>
        <li>Feature # 5 would go here!</li>
    </ul>
    
    <?php
    $Input = "";
    $Input .= "[FEATURES]\n";
    $Input .= "Fits in pocket\n";
    $Input .= "Waterproof\n";
    $Input .= "2-year warranty\n";
    $Input .= "[/FEATURES]";
    
    $NewInput = preg_replace_callback("~\[FEATURES\]((?:(?!\[/FEATURES\]).)*)\[/FEATURES\]~is",
            function ($Match) {
                return preg_replace("~(?<=[\r\n]|^)([^\r\n]*)(?=[\r\n]|$)~is", "<li>$1</li>", preg_replace("~^\s|\s$~is","",$Match[1]));
            }, $Input??"");
    
    $NewInput = "<ul>\n".$NewInput."\n</ul>";
    
    echo $NewInput;
    
    echo "<ul>" . implode('', 
        array_map(function ($item){ return '<li>' . $item . '</li>';},
            explode("\n", $string)
        )
    )
    . '</ul>' ;