为了避免SQL注入,就像我们所有人一样,我清理所有用户提供的字符串。现在我想给用户提供保存格式化文本的可能性,我想这样做的方式是复制Stack / WhatsApp方法:
*word*
- > 粗体 _word_
- > 斜体 在将文本上传到数据库之前,我会检查这个字符,如果匹配,我会替换
*word*
- &gt; <b>word</b>
_word_
- &gt; <i>word</i>
问题是,我确信有一种方法,使用正则表达式来表示:如果您符合此标准(即*word*
),请替换:
*
的第一次出现<b>
*
的第二次出现</b>
代码有效,非工作部分是foreach ()
内第二个if ()
循环中的部分。我最后一次绝望的尝试就是这样,但实际上,即使是像我这样的非正则派专家也没有任何意义。我试图将正则表达式划分为三个不同的部分,在preg_replace
中使用$1
和$3
进行回忆。
function textFormatting($text) {
$text = preg_replace('/[ \t]+/', ' ', $text); //transform any 2+ space in 1 space
$text = nl2br($text);
//$text = preg_replace('/[\n]+/', '<br>', $text);
$text = explode(' ', $text);
$regexAY =
[
'/([*]{1})([a-zA-Z0-9]+)([*]{1})/' =>
[
"pattern" => "*",
"openTag" => "<b>",
"closeTag" => "</b>"
],
'/([_]{1})([a-zA-Z0-9]+)([_]{1})/' =>
[
"pattern" => "_",
"openTag" => "<i>",
"closeTag" => "</i>"
]
];
$newText = [];
foreach ($text as $key => $word) {
foreach ($regexAY as $regex => $value) {
if (preg_match($regex, $word)) {
//$word = preg_replace($regexAY[$regex]["pattern"], $regexAY[$regex]["replacement"], $word);
$word = preg_replace('/$1/', $regexAY[$regex]["openTag"], $word);
$word = preg_replace('/$3/', $regexAY[$regex]["closeTag"], $word);
}
}
if ($word !== '') { array_push($newText, $word); }
}
return implode(' ', $newText);
}
$text = " Hi _this_ _text_ _is a test_
*for*
text _formatting_
so don't pay *attention*
d";
echo $text;
echo "\n -------- \n";
$text = textFormatting($text);
echo $text;
答案 0 :(得分:2)
我会将preg_replace
方法与\*(.*?)\*
一起用作模式:
$text = "This is a *word* and here are *more*. That is the case *with this too*.";
$output = preg_replace("/\*(.*?)\*/", "<b>$1</b>", $text);
echo $output;
返回:
This is a <b>word</b> and here are <b>more</b>. That is the case <b>with this too</b>.
如果您想使用正则表达式或添加更多示例,请查看此处。 https://regex101.com/r/aH6xr8/2