Php 用html标记替换聊天文本中的符号对,使其样式为粗体、斜体和删除线

Php 用html标记替换聊天文本中的符号对,使其样式为粗体、斜体和删除线,php,html,regex,parsing,preg-replace,Php,Html,Regex,Parsing,Preg Replace,我正在尝试制作一个whatsapp风格的文本帖子。当用户创建如下文本时: *Hi* ~how are you~ _where are you?_ $subject = "*Hi* ~how are you~ _where are you?_"; $message = preg_replace('/(?:\*)([^*]*)(?:\*)/', '<strong>$1</strong>', $subject); $message = preg_repla

我正在尝试制作一个whatsapp风格的文本帖子。当用户创建如下文本时:

*Hi* ~how are you~ _where are you?_
$subject = "*Hi* ~how are you~ _where are you?_";
$message = preg_replace('/(?:\*)([^*]*)(?:\*)/', '<strong>$1</strong>', $subject);
$message = preg_replace('/(?:_)([^_]*)(?:_)/', '<i>$1</i>', $message);
$message = preg_replace('/(?:~)([^~]*)(?:~)/', '<strike>$1</strike>', $message);
然后这个文本会自动地像这样改变

你好吗?你在哪里

我知道我可以用php正则表达式这样做:

*Hi* ~how are you~ _where are you?_
$subject = "*Hi* ~how are you~ _where are you?_";
$message = preg_replace('/(?:\*)([^*]*)(?:\*)/', '<strong>$1</strong>', $subject);
$message = preg_replace('/(?:_)([^_]*)(?:_)/', '<i>$1</i>', $message);
$message = preg_replace('/(?:~)([^~]*)(?:~)/', '<strike>$1</strike>', $message);
此示例适用于粗体文本:

function makeBoldText($orimessage){
    $message = $orimessage;
    $regex = "/\*([\w]*)\*/";
    $message = preg_replace($regex, '<strong>$0</strong>', $message);
    return  $message ;
}
echo makeBoldText($message);
斜体:

/_([\w]*)_/ 
删除线:

 /~([\w]*)~/

我的问题是,我能在一个正则表达式中完成所有这些吗?在输出时可以删除特殊字符吗?

我不知道是否可以在一个正则表达式中完成所有操作,但对于您的第二个问题:在输出时可以删除特殊字符吗,您可以这样做:

*Hi* ~how are you~ _where are you?_
$subject = "*Hi* ~how are you~ _where are you?_";
$message = preg_replace('/(?:\*)([^*]*)(?:\*)/', '<strong>$1</strong>', $subject);
$message = preg_replace('/(?:_)([^_]*)(?:_)/', '<i>$1</i>', $message);
$message = preg_replace('/(?:~)([^~]*)(?:~)/', '<strike>$1</strike>', $message);

如前所述,您可以使用粗体、斜体和strike,我不知道是否可以在一个正则表达式中完成所有操作,但对于您的第二个问题:输出时是否可以删除特殊字符,您可以执行以下操作:

*Hi* ~how are you~ _where are you?_
$subject = "*Hi* ~how are you~ _where are you?_";
$message = preg_replace('/(?:\*)([^*]*)(?:\*)/', '<strong>$1</strong>', $subject);
$message = preg_replace('/(?:_)([^_]*)(?:_)/', '<i>$1</i>', $message);
$message = preg_replace('/(?:~)([^~]*)(?:~)/', '<strike>$1</strike>', $message);

如前所述,您可以使用粗体、斜体和strike,您可以在此处使用单个调用preg_replace_callback:


您可以在以下位置使用单个调用进行preg_replace_回调:


在这里,您可以使用javascript的一个UDF函数在javascript上执行相同的操作

使用此函数可以使用正则表达式regex包装文本

函数包装器{ 如果str{ 返回str .替换/?:\*[^*]*?:\*/gm,$1 .替换/?:[^]*?:gm/gm,$1 .替换/?:~[^~]*?:~/gm,$1 .replace/?:`[^``]*?:```/gm,$1; }否则{ 返回str; } } 让str=Hello*Hiren Raiyani*,这是测试文本,它也有斜体文本和斜体文本,还有“单空格文本也存在”; 设htmlStr=wrapstr; console.loghtmlStr; document.getElementByIdstr-wrp.innerHTML=htmlStr;
在这里,您可以使用javascript的一个UDF函数在javascript上执行相同的操作

使用此函数可以使用正则表达式regex包装文本

函数包装器{ 如果str{ 返回str .替换/?:\*[^*]*?:\*/gm,$1 .替换/?:[^]*?:gm/gm,$1 .替换/?:~[^~]*?:~/gm,$1 .replace/?:`[^``]*?:```/gm,$1; }否则{ 返回str; } } 让str=Hello*Hiren Raiyani*,这是测试文本,它也有斜体文本和斜体文本,还有“单空格文本也存在”; 设htmlStr=wrapstr; console.loghtmlStr; document.getElementByIdstr-wrp.innerHTML=htmlStr;

这基本上是公正的。使用一些库来解析它。这并不像你想象的那么容易。有很多规则你需要考虑其他。这不应该在后端做,因为你不想把HTML存储在数据库中。HTML可以比Markdown大得多。除此之外,你应该让你的用户编辑他们的原始内容,这是在降价,对吗?想想看。@Victor你认为你会遇到什么问题?我只想用三种不同的方式得到图像。粗体、斜体和删除线。我不要别的了。多亏了anubhava的回答,问题才得以解决。我只是想说,这就像在你的存储库中只保留缩小的JavaScript一样,这基本上是公正的。使用一些库来解析它。这并不像你想象的那么容易。有很多规则你需要考虑其他。这不应该在后端做,因为你不想把HTML存储在数据库中。HTML可以比Markdown大得多。除此之外,你应该让你的用户编辑他们的原始内容,这是在降价,对吗?想想看。@Victor你认为你会遇到什么问题?我只想用三种不同的方式得到图像。粗体、斜体和删除线。我不要别的了。也要感谢anubhava的答案被解决了。我只是说这就像是在你的存储库中只保留缩小的JavaScript一样。亲爱的,非常感谢你的答案。但是代码对我来说有点复杂。我不知道如何使用它。你能告诉我如何在我的函数makeBoldText$orimessage{…}中使用你的答案吗?亲爱的,你能帮我检查一下这个屏幕截图吗?我哪里做错了?亲爱的阿努巴瓦,如果你有时间,你能回答我的问题吗?我真的需要帮助,因为我说我没有什么知识,因为我不是管理员,你需要在网上搜索。非常感谢你的回答亲爱的。但是代码对我来说有点复杂。我不知道如何使用它。你能告诉我如何在我的函数makeBoldText$orimessage{…}中使用你的答案吗?亲爱的,你能帮我检查一下这个屏幕截图吗?我哪里做错了?亲爱的阿努巴瓦,如果你有时间,你能回答我的问题吗?我真的需要帮助,因为我说我没有什么知识,因为我不是管理员,你需要在网上搜索。这对我来说很有用。我不知道为什么Azzo需要在同一个正则表达式中;但是忽略这一点,这应该是正确的方法,因为允许您使用嵌套样式,同时当前接受的答案不需要一次调用
preg_replace是必需的,因为该函数可以在第一个和第二个参数中接收数组。我不知道为什么Azzo需要在同一个正则表达式中;但是忽略这一点,这应该是正确的方法,因为允许您使用嵌套样式,同时当前接受的答案并不需要调用preg_replace,因为函数可以在第一个和第二个参数中接收数组。您可以在javascript上使用javascript的一个UDF函数执行相同的操作