如何匹配正则表达式中特定序列中的所有内容

时间:2011-12-02 20:17:50

标签: php regex regex-negation

我希望能够使用PHP中的正则表达式将字符串的某些部分转换为粗体。 当字符串包含由两个星号**包围的文本**时,它应该变为粗体。

我使用了三个例子:

**The quick brown fox jumps over the lazy dog.**

The **quick** brown fox **jumps over** the lazy dog.

**The quick* brown fox jumps over the lazy dog**.

我试过了:

$string = preg_replace('/\*\*(.+)\*\*/' , "<b>$1</b>" , $string);

第二个失败,因为它给出了:

The <b>quick** brown fox **jumps over</b> the lazy dog.

它应该在快速后停止并在跳跃时再次匹配。

我也尝试过:

$string = preg_replace('/\*\*([^*]+)\*\*/' , "<b>$1</b>" , $string);

哪个适用于第二个但未通过第三个,完全没有匹配。

我真正想要的是这样的:

$string = preg_replace('/\*\*([^*{2}]+)\*\*/' , "<b>$1</b>" , $string);

但我知道这是对的。我想我应该以某种方式使用负面的预测,但我不知道如何。

提前致谢。

4 个答案:

答案 0 :(得分:3)

你的模式中的+修饰符需要是不合适的(参见+之后的?)...否则它会吞噬它在主题字符串中最后一次出现的所有内容。

$p = '{\*\*(.+?)\*\*}';
$r = '<bold>$1</bold>'
preg_replace($p, $r, $subject);

答案 1 :(得分:1)

尝试\*\*(.+?)\*\*

你需要使&#34;匹配任何角色n#34;部分非贪婪,否则它会一直找到最后一次出现的**

答案 2 :(得分:1)

$string = preg_replace('/\*\*(.+?)\*\*/' , "<b>$1</b>" , $string);

?使捕获变得懒惰,这意味着它将尝试匹配最小的有限双星号组。

有关详细信息,请参阅此处:

http://www.regular-expressions.info/reference.html

答案 3 :(得分:0)

您可能已经知道这一点,但php markdown已经具备此功能,以及许多其他简单的格式化内容。