preg_replace,在添加空格时忽略

时间:2011-10-18 02:52:46

标签: php preg-replace

我有一段简单的代码可以将*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中使用的格式

3 个答案:

答案 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>

我说错了吗?