php标记符 编译,表情符号替换 – PHP

我需要将文本表情符号替换为html图像标记.我编译了以下数据:

private $smile = array(">:]", ":-)", ":)", ":o)", ":]", ":3", ":c)", ":>", "=]", "8)", "=)", ":}", ":^)");

private $laugh = array(">:D", ":-D", ":D", "8-D", "x-D", "X-D", "=-D", "=D", "=-3", "8-)");

private $sad = array(">:[", ":-(", ":(", ":-c", ":c", ":-.>", "<.>.

private $wink = array(">;]", ";-)", ";)", "*-)", "*)", ";-]", ";]", ";D", ";^)");

private $tongue = array(">:P", ":-P", ":P", "X-P", "x-p", ":-p", ":p", "=p", ":-Þ", ":Þ", ":-b", ":b", "=p", "=P");

private $surprise = array(">:o", ">:O", ":-O", ":O", "°o°", "°O°", ":O", "o_O", "o.O", "8-0");

private $annoyed = array(">:\\", ">:/", ":-/", ":-.", ":\\", "=/", "=\\", ":S");

private $cry = array(":'(", ";'(");

private $t_smile = "smile.png%5C%22";

private $t_laugh = "laugh.png%5C%22";

private $t_sad = "sad.png%5C%22";

private $t_wink = "wink.png%5C%22";

private $t_tongue = "tongue.png%5C%22";

private $t_surprise = "surprise.png%5C%22";

private $t_annoyed = "annoyed.png%5C%22";

private $t_cry = "cry.png%5C%22"

我目前只是在做一些例子:

$str = str_replace($this->laugh, $this->t_laugh, $str);

对于每个小组.它工作正常,但我需要更换只有当单词没有被字母或其他数字包围时才会发生.换句话说,我需要编译一个包含每个表情符号数组的正则表达式,这样我就可以使用preg_replace而不是str_replace.有没有办法我可以轻松地做到这一点,而不是硬编码正则表达式和逃避所有必要的字符?

编辑:

此外,我需要匹配和替换出现在字符串开头和结尾的表情符号,因此使用空格技术的简单填充是不够的.

编辑2:

我按照Mark的例子使用preg_quote从数组中预编译了正则表达式:

private $smile = "#(^|\W)(\>\:\]|\:-\)|\:\)|\:o\)|\:\]|\:3|\:c\)|\:\>|\=\]|8\)|\=\)|\:\}|\:\^\))($|\W)#";

private $laugh = "#(^|\W)(\>\:D|\:-D|\:D|8-D|x-D|X-D|\=-D|\=D|\=-3|8-\)|xD|XD|8D|\=3)($|\W)#";

private $sad = "#(^|\W)(\>\:\[|\:-\(|\:\(|\:-c|\:c|\:-\\.\>|\\.\

private $wink = "#(^|\W)(\>;\]|;-\)|;\)|\*-\)|\*\)|;-\]|;\]|;D|;\^\))($|\W)#";

private $tongue = "#(^|\W)(\>\:P|\:-P|\:P|X-P|x-p|\:-p|\:p|\=p|\:-Þ|\:Þ|\:-b|\:b|\=p|\=P|xp|XP|xP|Xp)($|\W)#";

private $surprise = "#(^|\W)(\>\:o|\>\:O|\:-O|\:O|°o°|°O°|\:O|o_O|o\.O|8-0)($|\W)#";

private $annoyed = "#(^|\W)(\>\:\\|\>\:/|\:-/|\:-\.|\:\\|\=/|\=\\|\:S|\:\/)($|\W)#";

private $cry = "#(^|\W)(\:'\(|;'\()($|\W)#";

与preg_replace完美配合!

解决方法:

如果你想使用正则表达式:

$pat = '#(^|\W)'.preg_quote($this->laugh,'#').'($|\W)#';

$str = str_replace($pat, $this->t_laugh, $str);

这基本上意味着表情符号可以位于字符串的开头或由非单词字符处理,并且必须后跟字符串的结尾或另一个非单词字符.如果您的表情符号包含任何特殊的正则表达式字符,则必须使用preg_quote.

此外,更好的格式可能是:

$emoticons = array(

'smile' => array(':]',':-)',...),

'laugh' => array('

...

)

然后你可以循环一切.

更新

应该使用负面的外观来匹配并排的表情符号.然后它不会尝试匹配周围的空间.

$smile = array(">:]", ":-)", ":)", ":o)", ":]", ":3", ":c)", ":>", "=]", "8)", "=)", ":}", ":^)");

$laugh = array(">:D", ":-D", ":D", "8-D", "x-D", "X-D", "=-D", "=D", "=-3", "8-)");

$sad = array(">:[", ":-(", ":(", ":-c", ":c", ":-.>", "<.>.

$wink = array(">;]", ";-)", ";)", "*-)", "*)", ";-]", ";]", ";D", ";^)");

$tongue = array(">:P", ":-P", ":P", "X-P", "x-p", ":-p", ":p", "=p", ":-Ã", ":Ã", ":-b", ":b", "=p", "=P");

$surprise = array(">:o", ">:O", ":-O", ":O", "°o°", "°O°", ":O", "o_O", "o.O", "8-0");

$annoyed = array(">:\\", ">:/", ":-/", ":-.", ":\\", "=/", "=\\", ":S");

$cry = array(":'(", ";'(");

$ary = array_merge($smile, $laugh, $sad, $wink, $tongue,$surprise,$annoyed,$cry);

foreach ($ary as $a)

{

$quoted[] = preg_quote($a, '#');

}

$regex = implode('|', $quoted);

$full = '#(?!

echo $full.PHP_EOL;

$str = "Testing :) emoticons :D :(";

preg_match_all($full, $str, $matches);

print_r($matches[0]);

此外,在编写正则表达式模式时尝试使用单引号,因为双引号允许转义序列,单引号不会解释转义序列.也就是说,在使用双引号时,有时需要加倍斜杠.

标签:php,regex,preg-replace,string

来源: https://codeday.me/bug/20190521/1146798.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值