$re = '/(?: # 采用非捕获括号进行分组(非必要不使用捕获型括号)
(`{3,}) # 捕获组,匹配三个及以上反引号,并进行捕获
[\s\S]*? # 采用非贪婪匹配(必须),匹配0到n次空白或非空白字符(任意字符)
(?:(?:\1`*)|\Z) # 引用,引用了之前的捕获组,若之前捕获了5个反引号,则在此必须匹配5个以上反引号,若开头三个以上反引号,后面没有比开头更多的反引号,则后面都是代码块
) # 结束第一个分支
| # 或符号
(?: # 同上,采用非捕获型括号
(~{3,}) # 同上,匹配三个及以上波浪号并进行捕获
[\s\S]*? # 同上,非贪婪匹配来匹配0到n次空白或非空白字符
(?:(?:\2~*)|\Z) # 引用,引用了之前的捕获组
) # 结束第二个分支
| # 或符号
(?: # 同上,采用非捕获型括号
(?<= # 肯定型逆序环视,左侧文本必须满足条件才可以匹配
(?:^\n)|(?:^\A) # 上一行必须只有一个回车(以回车符号开头)或没有上一行
) # 结束环视
(?: # 采用非捕获型括号分组
(?:\s{4,}?|\t+?)[^\n]*(?:\n|$) # 匹配四个及以上空格或一个以上制表符开启的一行
)+ # 上面的子组匹配1次到n次
) # 结束第三个分支/xm';
$str = ' this is a code block
// 1. 匹配四个空格导出的代码块
functino(asfd)
safdsadf
safsadf
safdsdaf
// 2. 匹配三个反引号所引出的代码块
```
func function(){
}
```
这里是一些文本
……
………………
``` python
print("hello")
```
// 3.如果四个空格之前的一行不是回车独占一行,则不会导出代码块(符合Markdown约定)
function(asfd)
safdsadf
safsadf
safdsdaf
safd
// 4. 匹配三个波浪号导出的代码块
~~~
fmt.println(123)
~~~
// 5. 匹配前后四个及以上反引号导出的代码块
````
aaa
```
````
这里是一些文本……
`````
print("this is a code block")
`````
`````
print("this is a code block")
````````````````````````
// 6. 匹配前后四个及以上波浪号导出的代码块
~~~~
aaa
~~~
~~~~
这里是一些文本……
~~~~~~
print("this is a code block")
~~~~~~
~~~~~~
print("this is a code block")
~~~~~~~~~~~~~~~~~~~~~~~~
// 7. 只有开头,没有结尾的,都算代码块
```
asdfasdf
asdfasdf
asdfasdf
asdfasdf
asdfasdf
asdf
没有结尾,这里也算代码块';
$subst = "";
$result = preg_replace($re, $subst, $str);
echo "The result of the substitution is ".$result;
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for PHP, please visit: http://php.net/manual/en/ref.pcre.php