假设

假设我的表情是:::aru:aru-45:: 这样的短代码,我需要匹配到 ::aru:aru-45:: ,那么我将会使用preg_replace_callback来实现这样的功能

preg 匹配替换

preg_replace_callback函数接受蛮多的参数(preg_replace_callback( mixed $pattern , callable $callback , mixed $subject [, int $limit = -1 [, int $count ]]): mixed),但是我只用前仨,接下来需要定一个Callback函数,暂且命名为 emojiCallback

那我们的正则匹配根据上面的假设就应该是:/::([^:\s]*?):([^:\s]*?)::/sm

image-20211024104304822

所以现在假定我们的替换是这样的

// $content 是文章内容(HTML和Text都一样)
$content = preg_replace_callback('/::([^:\s]*?):([^:\s]*?)::/sm','emojiCallback',$content);

在其中的emojiCallback这个参数可以用一个array,比如说array('CallBack', 'emojiCallback'),那么这个时候你的emojiCallback是在CallBack类里的,在替换的时候会调用CallBack::emojiCallback

emojiCallback 核心函数

上面的preg_replace_callback会给emojiCallback一个值,因此我们的emojiCallback需要接受一个参数(array类型)

就像是这样:

function emojiCallback($matches) {
    $emotionUrlPrefix = "OwO/img";
    $url = $emotionUrlPrefix
        .'/'
        [email protected]$matches[1]
        .'/'
        [email protected]$matches[2]
        .'.png';
    return '<img src="'
        .$url
        .'" class="emotion-'
        [email protected]$matches[1]
        .'">';
}

结果输出

$content = '::aru:163::';
// $content 是文章内容(HTML和Text都一样)
$content = preg_replace_callback('/::([^:\s]*?):([^:\s]*?)::/sm','emojiCallback',$content);
function emojiCallback($matches) {
    $emotionUrlPrefix = "OwO/img";
    $url = $emotionUrlPrefix
        .'/'
        [email protected]$matches[1]
        .'/'
        [email protected]$matches[2]
        .'.png';
    return '<img src="'
        .$url
        .'" class="emotion-'
        [email protected]$matches[1]
        .'">';
}

echo $content;

最后输出 <img src="/Users/wibus/Desktop/wibus/markdown/Typecho/OwO/img/aru/163.png" class="emotion-aru">

image-20211024105319049