我有一段简单的代码可以将*text*
转换为<strong>text</strong>
。
这一切都很有效,但现在我也希望能够使用*
制作列表,例如:
* item 1
* item 2
* item 3
这显然不适用于我当前的代码。有没有办法更改代码,以便忽略*
(旁边有空格)?
这是我目前的代码:
$content = preg_replace('#\*(.*?)\*#is', '<strong>$1</strong>', $content);
编辑:
对不起,我的例子可能有点不清楚。
所以这是原始输入:
*test*
* test
* test
* test
*test*
格式应为:
<strong>test</strong?
* test
* test
* test
<strong>test</strong>
贝司式*test*
应该显示为<strong>test</strong>
,除非*旁边有空格。
因此* test
将保持* test
这有点像basecamp中使用的格式
答案 0 :(得分:1)
您可以使用[^\s]
来匹配任何非空格字符(您也可以使用\b
来获取字边界,但是您会遇到非字字符问题)。你的代码是这样的:
$content = preg_replace('#\*([^\s\*]([^\*]*[^\s\*])?)\*#is', '<strong>$1</strong>', $content);
干杯,
答案 1 :(得分:0)
你想要一个字符类的逆,即[^]。在开始使用正则表达式时,我发现这非常宝贵。
http://www.regular-expressions.info/reference.html
编辑:我应该把它放在你的例子中。
'#[^ ]\*(.*?)\*#is'
编辑:在评论中澄清之后的一个经过测试的例子:
$in = "
*test*
* test
* test
*test*
";
echo preg_replace('/\*([^ \*]+)\*/', '<strong>$1</strong>', $in);
编辑:进一步澄清。当替换匹配的字符时,比如两个*之间的任何字符,更容易说'星号,然后是任何不是星号的东西,后面是关闭星号'而不是使用。在字面上简单地匹配你想要的简明英语描述中的“任何东西”这个词。它也更有效率,与后跟踪或其他东西(我不知道原因是什么)。由于您的列表对尾随空格具有重要意义,因此我将其添加到反向字符类中。
答案 2 :(得分:0)
抱歉,我可以确认您要实现的目标吗?
您想要更改此
* item 1 * item 2 * item 3
进入
* <strong>item 1</strong> * <strong>item 2</strong> * <strong>item 3</strong>
我说错了吗?