Regex Markdown匹配1个字符

时间:2015-03-30 18:31:25

标签: php regex preg-replace

我有一个简单,简单的降价功能(因为CMarkdown解析器与我的Yii系统有问题)但是,我遇到了与基本1字符标记匹配的问题,例如#的{​​{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'

2 个答案:

答案 0 :(得分:1)

这次我觉得我得到### etc:

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";

答案 1 :(得分:1)

你必须避免匹配多个#而不是匹配(.*)你可以试试这个:

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

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

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

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

已更新!