我一直在尝试在PHP中制作类似于Markdown的迷你标记解析器。输入如下所示:
有些文字**是大胆的!**和其他一些文字
到
有些文字< b>是粗体!< / b>和其他一些文字
我找到了无数资源,如何用另一个替换一大块文本,但只有一个实际上替换了后缀和后缀:this answer。稍微搞了一下它看起来像这样:
$s=preg_quote("**");
$in = preg_replace(
array('%'.$s.'-%', '%-%', '%'.$s.'%'),
array('<b>','_','</b>'),
$in);
早些时候的尝试同样笨拙。很明显,我并没有真正得到正则表达式或引擎的语法,所以我很茫然。另一种方法是将字符串破解成碎片并添加/删除我需要的东西,但正则表达式看起来更优雅。有什么想法吗?
修复:之前我错误地写了$s=preg_quote($s)
,更正为$s=preg_quote("**")
答案 0 :(得分:2)
我不熟悉php pre_replace及其接受您在代码中显示的数组的方式。但一般来说,正则表达式的方法看起来像这样:
搜索\*\*(.*?)\*\*
并替换为<b>\1</b>
。让我解释一下:
我们正在寻找**any text here**
形式的字符串*
需要转义,因为它们在正则表达式中具有特殊含义 - 因此\*
。正则表达式(.*?)
的核心部分匹配任意长度的任何字符串(.
匹配任何字符)(*
这里有正则表达式含义)。但我们只想查找下一个**
(字符串中可能会有更多内容),因此我们必须搜索 ungreedy (因此?
)。括号使正则表达式引擎捕获正则表达式的这一部分所匹配的任何内容。
最后,我们使用\1
引用匹配的部分(在某些引擎中也可以$1
)。
答案 1 :(得分:2)
你应该使用一个基本的'\ * \ *(。+?)\ * \ *'正则表达式。
$s = preg_replace(
'/\*\*(.+?)\*\*/isU',
'<b>$1</b>',
$s);
答案 2 :(得分:0)
试试这个
$string = explode('**', $sometext);
$newstr = '';
$size = count($string);
for ($i = 0; $i < $size; ++$i) {
if (($i % 2 == 0 || $i == 0 )&& $i != $size-1 )
$newstr .= $string[$i]."<b>";
else if($i % 2 != 0 && $i != $size && $i != $size-1 )
$newstr .= $string[$i]."</b>" ;
else if($i == $size-1)
$newstr .= $string[$i];
}
echo $newstr;