我希望能够使用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);
但我知道这是对的。我想我应该以某种方式使用负面的预测,但我不知道如何。
提前致谢。
答案 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);
?使捕获变得懒惰,这意味着它将尝试匹配最小的有限双星号组。
有关详细信息,请参阅此处:
答案 3 :(得分:0)
您可能已经知道这一点,但php markdown已经具备此功能,以及许多其他简单的格式化内容。