转换祝辞& lt;笑脸到一个图像


Convert >< smiley to an image

我有以下匹配><的正则表达式:/('''>'''<)/。但是当我使用这个正则表达式时,什么也没有发生。

如何匹配><并将其转换为图像?

如果您需要整个函数来查看它的样子:

function bbcode($string) {
    # GLOBAL
    global $folder_smileys;
    # VARIABLE
    $hashtag = str_replace('|', '', $string);
    $string = nl2br($string);
    $icon_div_1 = '<div class="icon-inplace" style="background-image: url(';
    $icon_div_2 = ');"></div>';

    # ARRAY
    $codes = Array(
        '/'[b'](.+?)'['/b']/' => '<div class="font-bold">'1</div>',
        '/'[i'](.+?)'['/i']/' => '<div class="font-italic">'1</div>',
        '/'[s'](.+?)'['/s']/' => '<div class="font-strikethrough">'1</div>',
        '/'[url=(.+?)'](.+?)'['/url']/' => '<a href="'1" target="_blank">'2</a>',
        '/:')/' => $icon_div_1 . url($folder_smileys.'smiley-1f642.png') . $icon_div_2,
        '/;')/' => $icon_div_1 . url($folder_smileys.'smiley-1f609.png') . $icon_div_2,
        '/:'//' => $icon_div_1 . url($folder_smileys.'smiley-1f615.png') . $icon_div_2,
        '/:'(/' => $icon_div_1 . url($folder_smileys.'smiley-1f641.png') . $icon_div_2,
        '/:O/' => $icon_div_1 . url($folder_smileys.'smiley-1f632.png') . $icon_div_2,
        '/:P/' => $icon_div_1 . url($folder_smileys.'smiley-1f61b.png') . $icon_div_2,
        '/-.-/' => $icon_div_1 . url($folder_smileys.'smiley-1f611.png') . $icon_div_2,
        '/'^'^/' => $icon_div_1 . url($folder_smileys.'smiley-1f604.png') . $icon_div_2,
        '/:@/' => $icon_div_1 . url($folder_smileys.'smiley-1f621.png') . $icon_div_2,
        '/<3/' => $icon_div_1 . url($folder_smileys.'symbol-2764.png') . $icon_div_2,
        '/O.o/' => $icon_div_1 . url($folder_smileys.'smiley-1f924.png') . $icon_div_2,
        '/'(Y')/' => $icon_div_1 . url($folder_smileys.'symbol-1f44d-1f3fb.png') . $icon_div_2,
        '/('''>'''<)/' => $icon_div_1 . url($folder_smileys.'smiley-1f616.png') . $icon_div_2
    );

    # OUTPUT
    return preg_replace(array_keys($codes), array_values($codes), $string);
}

echo bbcode('><');  // Outputs >< and not as an image

说明:

function bbcode($string) {
    $smileys = [ ':)' => $icon_div_1 . url($folder_smileys. 'smiley-1f642.png') . $icon_div_2,
                 ';)' => $icon_div_1 . url($folder_smileys. 'smiley-1f649.png') . $icon_div_2,
                 // etc.
               ];
    $result = strtr($string, $smileys);
    $codes = [
        '~'[b](.+?)'[/b]~s' => '<div class="font-bold">'1</div>',
        '~'[i](.+?)'[/i]~s' => '<div class="font-italic">'1</div>',
        '~'[s](.+?)'[/s]~s' => '<div class="font-strikethrough">'1</div>',
        '~'[url=(.+?)](.+?)'[/url]~s' => '<a href="'1" target="_blank">'2</a>',
    ];
    $result = preg_replace(array_keys($codes), $codes, $result);
    return $result;
}

你需要先替换笑脸符号,否则由粗体、斜体和url bbcodes生成的尖括号有被覆盖的风险。

你必须明白,当你给一个数组preg_replace(或str_replace,行为是相同的),该函数采取第一个项目,继续替换并产生一个新的字符串,然后下一个项目使用这个新的字符串,并进行下一个替换。为了说明这种行为,如果您这样写:

$string = 'az';
$rep = [ '~a~' => 'z',
         '~z~' => 'a' ];
echo preg_replace(array_keys($rep), $rep, $string);

您将获得"aa"(圆形替换的原因:"az" -> "zz" -> "aa")。

strtr的行为不同,只解析字符串一次(无论替换对的数量如何)。

$string = 'az';
$rep = [ 'a' => 'z',
         'z' => 'a' ];
echo strtr($string, $rep);

返回"za"(一次传递)