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