匹配符

符号意思
?0个或1个
+1个或多个
*0个或多个
.除换行符\n之外的任何单字符
^开始符,在方括号内容使用是取反的意思
$结束符
()子表达式,匹配整体:123
[]子表达式,逐个匹配:1、2、3
\转义字符
{}限定表达式
{n,m}满足条件且长度为n~m的字符串,{n}匹配n次,{n,}匹配至少n次
[^abc]取反,匹配除了a、b、c之外的其它内容
[a-z]区间,匹配a~z的所有字母,还有[0-9]、[A-Z]等
.匹配除了换行之外的所有字符,等同于[^\n\r]
|多个选择一个
[\s\S]匹配所有但不包括换行,\s所有空白符,等价于[\f\n\r\t\v]。\S所有非空白符,等价于[^\f\n\r\t\v]。
\w匹配字母、数字、下划线。等价于 [A-Za-z0-9_]
\f换页符,等价于\x0c和\cL
\n换行符,等价于\x0a和\cJ
\r回车符,等价于\x0d和\cM
\t制表符,等价于\x09和\cI
\v垂直制表符,等价于\x0b和\cK

修饰符

修饰符含义
gglobal - 全局匹配
iignore - 不区分大小写
mmulti line - 多行匹配,尤其是有^和$边界符时
s特殊字符圆点 . 中包含换行符 \n
uUnicode,匹配Unicode字符

不同语言

语言.[]^$(){}?+|()
javascript
php
python
java

PHP处理emoji

1、emoji保存到数据库中:将emoji的Unicode以json格式存在数据库中

$emoji_matched = preg_match_all('/./u', $content, $emoji_matches);//以Unicode格式匹配所有字符
if ($emoji_matched) {
    foreach ($emoji_matches[0] as $e) {
        if (strlen($e) >= 4) {//字符长度>=4是为emoji
            $content = str_replace($e, json_encode($e), $content);
        }
    }
}

2、从数据库中读取后回显为emoji

$content = htmlspecialchars_decode($post['post_content']);
$matched = preg_match_all('/("\\\u).+?(")/', $content, $matches, PREG_SET_ORDER);
if ($matched) {
    foreach ($matches as $m) {
        $content = str_replace($m[0], json_decode($m[0]), $content);

    }
}

Javascript匹配emoji

// Match almost all emoji
const str = "Hello 😃 😄";
const regexExp = /(\u00a9|\u00ae|[\u2000-\u3300]|\ud83c[\ud000-\udfff]|\ud83d[\ud000-\udfff]|\ud83e[\ud000-\udfff])/gi;
regexExp.test(str);// true