1

在我正在构建的项目中,我想按如下方式使用降价

*text* = <em>text</em>
**text** = <strong>text</strong>
***text*** = <strong><em>text</em><strong>

由于这是我需要的仅有的三种 markdown 格式,我想保持轻量级并避免导入整个 PHP markdown 库,因为这会引入我不需要的功能并产生问题。

所以我一直在尝试构建一些简单的正则表达式替换。使用 preg_replace 我运行:

'/(\*\*\*)(.*?)\1/' to '<strong><em>\2</em></strong>'

'/(\*\*)(.*?)\1/' to '<strong>\2</strong>'                                                                      

'/(\*)(.*?)\1/' to '<em>\2</em>',      

这很好用!em,粗体,并且组合都可以正常工作...

但是,如果用户犯了错误或输入了很多星,一切都会中断。

IE

****hello**** = <strong><em><em>hello</em></strong></em>
*****hello***** = <strong><em><strong>hello</em></strong></strong>
******hello****** = <strong><em></em></strong>hello<strong><em></em></strong>
etc

理想情况下它会创建

****hello**** = *<strong><em>hello</em></strong>*
*****hello***** = **<strong><em>hello</em></strong>**
******hello****** = ***<strong><em>hello</em></strong>***
etc

忽略不需要的星号(这样用户就会清楚他们犯了错误,更重要的是,呈现的 HTML 仍然有效)。

我认为必须有某种方法来修改我的正则表达式来做到这一点,但即使经过一整天的尝试,我也无法终生完成它!

我也会对结果感到满意

******hello****** = <strong><em>hello</em></strong>

所以请,有人可以帮助我吗?

也请考虑不均匀的星星。在这种情况下,以下场景将是理想的。

***hello* = **<em>hello</em>

以及星星应该是身体的一部分并且未被检测到的时间,例如,如果用户输入:

'terms and conditions may apply*'

or

'I give the film 5* out of 10'

非常感谢

4

1 回答 1

0

尝试不同的捕获模式(匹配除*一次或多次之外的任何内容),

'/(\*\*\*)([^*]+)\1/'
于 2013-06-23T19:26:29.390 回答