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></h3>',
'<h2></h2>',
'<h1></h1>',
'<h3></h3>',
'<h2></h2>',
'<h1></h1>',
'<i></i>',
'<i></i>',
'<strong></strong>',
'<strong></strong>',
'<i><strong></strong></i>',
'<span style="color:"></span>'
);
} else {
$smReplacement = '';
}
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></h3>',
'<h2></h2>',
'<h1></h1>',
'<h33></h33>',
'<h22></h22>',
'<h11></h11>',
'<i></i>',
'<i></i>',
'<strong></strong>',
'<strong></strong>',
'<i><strong></strong></i>',
'<span style="color:"></span>'
);
} else {
$smReplacement = '';
}
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
已更新!!!
我有一个简单的 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></h3>',
'<h2></h2>',
'<h1></h1>',
'<h3></h3>',
'<h2></h2>',
'<h1></h1>',
'<i></i>',
'<i></i>',
'<strong></strong>',
'<strong></strong>',
'<i><strong></strong></i>',
'<span style="color:"></span>'
);
} else {
$smReplacement = '';
}
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></h3>',
'<h2></h2>',
'<h1></h1>',
'<h33></h33>',
'<h22></h22>',
'<h11></h11>',
'<i></i>',
'<i></i>',
'<strong></strong>',
'<strong></strong>',
'<i><strong></strong></i>',
'<span style="color:"></span>'
);
} else {
$smReplacement = '';
}
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
已更新!!!