【问题标题】:Php preg_replace with array in elementsphp preg_replace 元素中的数组
【发布时间】:2017-11-30 08:20:11
【问题描述】:

我正在尝试做表情符号系统,如果数组中的元素穿过页面,则将值翻转到对面。示例:

 $emoticons = array(
      ':)'    =>  '<img src="assets/smiles/smilesblank.png" alt="smile" class="img-responsive" />',
      ':-)'   =>  '<img src="assets/smiles/smilesblank.png" alt="smile" class="icon_smile" />',
      ':D'    =>  '<img src="assets/smiles/smilesblank.png" alt="smile" class="icon_laugh" />',
      ':d'    =>  '<img src="assets/smiles/smilesblank.png" alt="laugh" class="icon_laugh" />',
      ';)'    =>  '<img src="assets/smiles/smilesblank.png" alt="wink" class="icon_wink" />',
      ':P'    =>  '<img src="assets/smiles/smilesblank.png" alt="tounge" class="icon_tounge" />',
      ':-P'   =>  '<img src="assets/smiles/smilesblank.png" alt="tounge" class="icon_tounge" />',
      ':-p'   =>  '<img src="assets/smiles/smilesblank.png" alt="tounge" class="icon_tounge" />',
      ':p'    =>  '<img src="assets/smiles/smilesblank.png" alt="tounge" class="icon_tounge" />',
      ':('    =>  '<img src="assets/smiles/smilesblank.png" alt="sad face" class="icon_sad" />',
      ':o'    =>  '<img src="assets/smiles/smilesblank.png" alt="shock" class="icon_shock" />',
      ':O'    =>  '<img src="assets/smiles/smilesblank.png" alt="shock" class="icon_shock" />',
      ':0'    =>  '<img src="assets/smiles/smilesblank.png" alt="shock" class="icon_shack" />',
      ':|'    =>  '<img src="assets/smiles/smilesblank.png" alt="straight face" class="icon_straight" />',
      ':-|'   =>  '<img src="assets/smiles/smilesblank.png" alt="straight face" class="icon_straight" />',
      ':/'    =>  '<img src="assets/smiles/smilesblank.png" alt="straight face" class="icon_straight" />',
      ':-/'   =>  '<img src="assets/smiles/smilesblank.png" alt="straight face" class="icon_straight" />'
 );
 foreach($emoticons as $icon => $image) {
      $icon = preg_quote($icon);
      $text = preg_replace("~\b$icon\b~",$image,$text);
 }

【问题讨论】:

  • 这里不能使用\b,请使用"~(?&lt;!\w)$icon(?!\w)~"。或"~(?&lt;!\S)$icon(?!\S)~",具体取决于您要在什么上下文中匹配表情符号。
  • 您将负责?哈哈。不管怎样,你也可以试试strtr route
  • 谢谢,但没有改变。如果你写的是:
  • 如果您不明确您遇到的问题,我们无法为您提供更多帮助。

标签: php arrays preg-replace emoji


【解决方案1】:

在大多数情况下,您在匹配表情符号时不需要检查单词边界,因为它们通常粘在其他一些文本上。因此,\b 相当多余,可以删除。如果您真的只想针对特定的上下文,您可以考虑将第一个 \b 替换为 (?&lt;!\w) (如果表情符号不能以单词 char 开头),将第二个替换为 (?!\w) (后面没有单词 char),或使用空白边界,分别为(?&lt;!\S)(?!\S)

您可以按长度按降序对数组的键进行排序(如果有重叠的表情符号,例如:-||:-|),在preg_quoteing 键时构建基于交替的正则表达式模式,并且使用preg_replace_callback 将每个键替换为其对应的值:

array_multisort(array_map('strlen', array_keys($emoticons)), SORT_DESC, $emoticons);        //   IN DESCENDING ORDER
$pattern = '~' . implode("|", array_map(function($x) {return preg_quote($x, '~');}, array_keys($emoticons))) . '~';
echo preg_replace_callback($pattern, function($m) use ($emoticons) {
       return $emoticons[$m[0]];
    }, "Some :| emoticon :O");

查看PHP demo,对于"Some :| emoticon :O" 字符串,结果为

Some <img src="assets/smiles/smilesblank.png" alt="straight face" class="icon_straight" /> emoticon <img src="assets/smiles/smilesblank.png" alt="shock" class="icon_shock" />

【讨论】:

  • 问题是真的,但是有类似的东西在页面上找到的时候需要改一下
  • @OsmanCakmak 注意现在有一个警告:如果您不想在:Dot 中匹配:D,则必须在模式末尾添加(?!\w)。或(?!\S)。正如我在原始帖子下的评论中提到的那样。使用\b,您需要在非单词字符之后添加单词字符,反之亦然。请定义正确的上下文。
  • @OsmanCakmak 当您在页面上找到类似的东西时需要更改 是什么意思?将"Some :| emoticon :O" 替换为$text
【解决方案2】:

您可以使用preg_replace_callback_array

它使用模式数组->替换函数几乎与你的相同。

我为你做了一个小例子:

<?php

// initial array
$emoticons = [
    ':)'    =>  '<img src="assets/smiles/smilesblank.png" alt="smile" class="img-responsive" />',
    ':-)'   =>  '<img src="assets/smiles/smilesblank.png" alt="smile" class="icon_smile" />',
    ':D'    =>  '<img src="assets/smiles/smilesblank.png" alt="smile" class="icon_laugh" />',
    ':d'    =>  '<img src="assets/smiles/smilesblank.png" alt="laugh" class="icon_laugh" />',
    ';)'    =>  '<img src="assets/smiles/smilesblank.png" alt="wink" class="icon_wink" />',
    ':P'    =>  '<img src="assets/smiles/smilesblank.png" alt="tounge" class="icon_tounge" />',
    ':-P'   =>  '<img src="assets/smiles/smilesblank.png" alt="tounge" class="icon_tounge" />',
    ':-p'   =>  '<img src="assets/smiles/smilesblank.png" alt="tounge" class="icon_tounge" />',
    ':p'    =>  '<img src="assets/smiles/smilesblank.png" alt="tounge" class="icon_tounge" />',
    ':('    =>  '<img src="assets/smiles/smilesblank.png" alt="sad face" class="icon_sad" />',
    ':o'    =>  '<img src="assets/smiles/smilesblank.png" alt="shock" class="icon_shock" />',
    ':O'    =>  '<img src="assets/smiles/smilesblank.png" alt="shock" class="icon_shock" />',
    ':0'    =>  '<img src="assets/smiles/smilesblank.png" alt="shock" class="icon_shack" />',
    ':|'    =>  '<img src="assets/smiles/smilesblank.png" alt="straight face" class="icon_straight" />',
    ':-|'   =>  '<img src="assets/smiles/smilesblank.png" alt="straight face" class="icon_straight" />',
    ':/'    =>  '<img src="assets/smiles/smilesblank.png" alt="straight face" class="icon_straight" />',
    ':-/'   =>  '<img src="assets/smiles/smilesblank.png" alt="straight face" class="icon_straight" />'
];

// prepare callbacks
$callbacks = [];
foreach ($emoticons as $smileCode => $replacement) {
    // regular expression, nothing smart, just plain replacement
    $regex = '~' . preg_quote($smileCode, '~') . '~';
    $callbacks[ $regex ] = function () use ($replacement) {
        return $replacement;
    };
}

$text = "Hello :), this is cool :P smile and :-| another one";

echo "<pre>\n";
echo preg_replace_callback_array($callbacks, $text);

【讨论】:

  • 感谢您的宝贵意见,页面返回了一个空值(我想我找到了)但是您能告诉我它是如何使用的吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-16
  • 1970-01-01
  • 2015-03-01
  • 1970-01-01
相关资源
最近更新 更多