【问题标题】:Regex preg_replace for emoticons [duplicate]用于表情符号的正则表达式 preg_replace [重复]
【发布时间】:2012-06-26 02:55:02
【问题描述】:

可能重复:
Replace a list of emoticons with their images

我正在开发一个网站,我想让用户可以在帖子上微笑。 我的(只是功能性的)想法是以这种方式使用数组:

$emoticons = array(
array("17.gif",":)"),
array("6.jpg",":P"),
.....
array("9.jpg",":'("),
array("5.gif","X)")
);

图片在 [0] 上,表情在 [1] 上。 在每个 $post 上:

foreach($emoticons as $emoticon){
     $quoted_emoticon = preg_quote($emoticon[1],"#");
     $match = '#(?!<\w)(' . $quoted_emoticon .')(?!\w)#';
     $post = preg_replace($match,'<img src="images/emoticons/'.$emoticon[0].'">',$post);
}

这很好用,但我的问题是 '#(?!&lt;\w)('')(?!\w)#' 因为我希望仅在前面的字符为“开始”(^)或“空白”且后续字符为“结束”时应用表情符号( $) 或“空白”。执行此操作的正确正则表达式是什么?

【问题讨论】:

  • 您希望仅在字符串的开头或结尾替换表情符号?
  • 不,无处不在...甚至在开头或结尾...与任何其他论坛完全一样...

标签: php regex preg-replace


【解决方案1】:

我会选择:

$e = array( ':)' => '1.gif',
            ':(' => '2.gif',
          );

foreach ($e as $sign => $file) { 
  $sign = preg_replace('/(.)/', "\\$1", $sign); 
  $pattern = "/(?<=\s|^)$sign(?=\s|$)/";
  $post = preg_replace($pattern, " <img src=\"images/emoticons/$file\">", $post);  
} 

【讨论】:

  • 不,你不明白或者我无法解释这个问题:我只想在前面/后面的字符为空白时应用替换(或者它们是 ^|$,这意味着开始/结束)我的数据结构已经工作了!我更换没问题...我想限制何时更换!
  • 如果有人写:你好,我的名字是拉尔夫 ;-) 好的。如果有人写:你好,我的名字是拉尔夫;-) 不明白吗?
【解决方案2】:

我认为你想要积极的眼光和积极的未来。

例子:

(?<=\s|^)(\:\))(?=\s|$)

您的示例已更新:

foreach($emoticons as $emoticon){
     $quoted_emoticon = preg_quote($emoticon[1],"#");
     $match = '(?<=\s|^)(' . $quoted_emoticon .')(?=\s|$)';
     $post = preg_replace($match,'<img src="images/emoticons/'.$emoticon[0].'">',$post);
}

【讨论】:

  • 更好...但并不完美,因为第一次出现不起作用。一开始,如果 $post 只是:) 它不起作用!
  • 我是这样改的:$match = '#(?
  • 事实上是这样的:$match = '#(?
  • 对不起,一个懒惰的复制粘贴错误。我更新了我的表情。
  • 无论如何,这正是我所需要的。谢谢;-) :D
猜你喜欢
  • 2020-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-10
  • 2011-05-20
  • 2016-07-11
  • 2023-04-10
相关资源
最近更新 更多