Regex Markdown匹配1个字符


Regex Markdown Matching 1 character

我有一个简单的markdown函数(因为CMarkdown解析器在我的Yii系统中有问题),但是,我在匹配基本1个字符的标记时遇到了问题,比如<h1>#标记

/**
* Parse string with Simple Markdwon
* @param $text string
* @param $markdown true | false
* @return string
*/
public static function simpleMarkdown($text, $markdown = false) { 
    $simpleMarkdown = array(
                            '/'.preg_quote('###').'{3}(.*)/i',
                            '/'.preg_quote('##').'{2}(.*)/i',
                            '/'.preg_quote('#').'{1}(.*)/i',
                            '/'.preg_quote('###').'{3}(.*)'.preg_quote('###').'{3}/i',
                            '/'.preg_quote('##').'{2}(.*)'.preg_quote('##').'{2}/i',
                            '/'.preg_quote('#').'{1}(.*)'.preg_quote('#').'{1}/i',
                            '/'.preg_quote('***').'{3}(.*)'.preg_quote('***').'{3}/i',
                            '/'.preg_quote('**').'{2}(.*)'.preg_quote('**').'{2}/i',
                            '/'.preg_quote('__').'{2}(.*)'.preg_quote('__').'{2}/i',
                            '/'.preg_quote('*').'{1}(.*)'.preg_quote('*').'{1}/i',
                            '/'.preg_quote('_').'{1}(.*)'.preg_quote('_').'{1}/i',
                            '/'.preg_quote('[c').'{1}(.*)'.preg_quote(']').'{1}(.*)'.preg_quote('[c]').'{1}/i'
                           );
    if ($markdown) {
        $smReplacement = array(
                               '<h3>$1</h3>',
                               '<h2>$1</h2>',
                               '<h1>$1</h1>',
                               '<h3>$1</h3>',
                               '<h2>$1</h2>',
                               '<h1>$1</h1>',
                               '<i>$1</i>',
                               '<i>$1</i>',
                               '<strong>$1</strong>',
                               '<strong>$1</strong>',
                               '<i><strong>$1</strong></i>',
                               '<span style="color:$1">$2</span>'
                              );
    } else {
        $smReplacement = '$1';
    }
    return preg_replace($simpleMarkdown, $smReplacement, $text);
}

例如,使用##Hello World##这样的输入,我将获得

<h2>Hello World</h2>
<h1></h1>
<h1></h1>

的新尝试

    $simpleMarkdown = array(
                            '/'.preg_quote('#').'{3}(.*)/i',
                            '/'.preg_quote('#').'{2}(.*)/i',
                            '/'.preg_quote('#').'{1}([^#]*)/i',
                            '/'.preg_quote('#').'{3}(.*)'.preg_quote('#').'{3}/i',
                            '/'.preg_quote('#').'{2}(.*)'.preg_quote('#').'{2}/i',
                            '/'.preg_quote('#').'{1}([^#]*)'.preg_quote('#').'{1}/i',
                            '/'.preg_quote('*').'{3}(.*)'.preg_quote('*').'{3}/i',
                            '/'.preg_quote('*').'{2}(.*)'.preg_quote('*').'{2}/i',
                            '/'.preg_quote('_').'{2}(.*)'.preg_quote('_').'{2}/i',
                            '/'.preg_quote('*').'{1}(.*)'.preg_quote('*').'{1}/i',
                            '/'.preg_quote('_').'{1}(.*)'.preg_quote('_').'{1}/i',
                            '/'.preg_quote('[c').'{1}(.*)'.preg_quote(']').'{1}(.*)'.preg_quote('[c]').'{1}/i'

    $simpleMarkdown = array(
                            '/'.preg_quote('#').'{3}([^#]*)/i',
                            '/'.preg_quote('#').'{2}([^#]*)/i',
                            '/'.preg_quote('#').'{1}([^#]*)/i',
                            '/'.preg_quote('#').'{3}([^#]*)'.preg_quote('#').'{3}/i',
                            '/'.preg_quote('#').'{2}([^#]*)'.preg_quote('#').'{2}/i',
                            '/'.preg_quote('#').'{1}([^#]*)'.preg_quote('#').'{1}/i',
                            '/'.preg_quote('*').'{3}([^#]*)'.preg_quote('*').'{3}/i',
                            '/'.preg_quote('*').'{2}([^#]*)'.preg_quote('*').'{2}/i',
                            '/'.preg_quote('_').'{2}([^#]*)'.preg_quote('_').'{2}/i',
                            '/'.preg_quote('*').'{1}([^#]*)'.preg_quote('*').'{1}/i',
                            '/'.preg_quote('_').'{1}([^#]*)'.preg_quote('_').'{1}/i',
                            '/'.preg_quote('[c').'{1}(.*)'.preg_quote(']').'{1}(.*)'.preg_quote('[c]').'{1}/i'
                           );

这一次我想我是为###等获得的:

function simpleMarkdown($text, $markdown = false) { 
    $simpleMarkdown = array(
                        '/'.preg_quote('#')."{3}([^#'n]+?)".preg_quote('#').'{3}/i',
                        '/'.preg_quote('#')."{2}([^#'n]+?)".preg_quote('#').'{2}/i',
                        '/'.preg_quote('#')."{1}([^#'n]+?)".preg_quote('#').'{1}/i',
                        '/'.preg_quote('#').'{3}([^#'n]+)/i',
                        '/'.preg_quote('#').'{2}([^#'n]+)/i',
                        '/'.preg_quote('#').'{1}([^#'n]+)/i'
                       );
    if ($markdown) {
        $smReplacement = array(
                           '<h3>$1</h3>',
                           '<h2>$1</h2>',
                           '<h1>$1</h1>',
                           '<h33>$1</h33>',
                           '<h22>$1</h22>',
                           '<h11>$1</h11>',
                           '<i>$1</i>',
                           '<i>$1</i>',
                           '<strong>$1</strong>',
                           '<strong>$1</strong>',
                           '<i><strong>$1</strong></i>',
                           '<span style="color:$1">$2</span>'
                          );
    } else {
        $smReplacement = '$1';
    }
    return preg_replace($simpleMarkdown, $smReplacement, $text);
}
echo simpleMarkdown('#Hello world# #Hello world#', true) . "'n";
echo simpleMarkdown('##Hello world## #Hello world#', true) . "'n";
echo simpleMarkdown('###Hello world### ##Hello world##', true) . "'n";
echo simpleMarkdown("##Hello world'n##Hello world## #Hello world#", true) . "'n";

您必须避免匹配多个#,因此您可以尝试以下方法而不是匹配(.*)

#([^#]+)#[^#]

这将匹配任何不是#的字符,也是

'/#([^#]+)#[^#]/g'

你可以在这里测试https://regex101.com/r/aV8rJ0/5

更新!!!