【发布时间】:2015-05-30 12:37:31
【问题描述】:
我有一个非常奇怪的问题,我花了很多时间但没有任何成功......我的网站上有一个内容可编辑区域,用户可以在其中选择他们可以在书面文本中立即看到的表情符号(在内容可编辑区域的情况下)。因此,对于从用户到用户的消息,我不关心文本的长度,但对于编写 cmets,我关心!我需要计算字符串的所有字符。
现在我遇到了表情符号这样传输的问题:
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACwAAAAAAQABAAA=" class="emoticon emoticon-class-name-for-example-happy">
好吧,当然我只想为每个表情符号计算 1 个字符,所以我编写了一个正则表达式并尝试用“1”替换所有表情符号。之后我认为只需 strlen 就很容易得到使用的字符数。 但这仅在理论上有效,但该死的为什么...... .
所以我的正则表达式是:
<img[ ]src=["'].+?["'][ ]class=["']emoticon[ ].+?["'][>]
下一点是我开始在 phpliveregex.com 的帮助下测试我的正则表达式。结果你可以看到here。只需点击 preg_replace 选项卡。
现在我很确定这对我有用,我试了一下。我用 PHP 写了一个函数:
private function countCharactersOfSpecialUserInput($userInput) {
$wholeCharacters = 0;
$input_lines = 'This is a test
for<img src="data:image/gif;base64,R0lGODlhAQABAAAAACwAAAAAAQABAAA=" class="emoticon Girl">my
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACwAAAAAAQABAAA=" class="emoticon Girl">regex
which<img src="data:image/gif;base64,R0lGODlhAQABAAAAACwAAAAAAQABAAA=" class="emoticon Girl">should
be alright <img src="data:image/gif;base64,R0lGODlhAQABAAAAACwAAAAAAQABAAA=" class="emoticon Not-Talking">and<img src="data:image/gif;base64,R0lGODlhAQABAAAAACwAAAAAAQABAAA=" class="emoticon Not-Talking">
match all this emoticons except things like <img dsopjfdojp
<img oew> because this ones are not real emoticons! The following is a real one: <img src="data:image/gif;base64,R0lGODlhAQABAAAAACwAAAAAAQABAAA=" class="emoticon Girl">
';
return preg_replace("/<img[ ]src=[\"'].+?[\"'][ ]class=[\"']emoticon[ ].+?[\"'][>]/", "1", $input_lines);
}
在我的函数中,我现在不计算字符数,因为有一个我不明白的错误。这听起来不可能,但它是真实的:-(。
如果我使用保存在变量 $input_lines 中的字符串,它工作得很好。但是,如果我使用用户可以传输的文本,它就不起作用!
我使用 var_dump 和 print_r 从用户那里获取传输的数据。之后我完全使用了这个字符串并将其保存在 input_lines 变量中。令人难以置信的事实是,通过使用 input_lines 变量,它又可以工作了......不管我做什么,我的代码都不会替换单个表情符号,而文本是由用户动态传输的......
您有什么可以想象的可能会导致此问题的情况吗? 我一无所知,我无法相信这是真的。它必须起作用,我尝试了很多其他的方法,但对我没有任何作用......
【问题讨论】:
-
你不是最好
strlen原始源数据(包含表情符号的代码),而不是渲染数据(包含img元素)吗? -
我不知道你是否理解我的问题......如果我只使用 strlen 比我只得到一个大约 80 或 90 个字符的表情符号,但用户只使用了 1 个应该算作 1 的表情符号用过的字符!
-
@hek2mgl 如果没有人可以帮助我,我将不得不重新考虑,然后我将看看 php 的 DOM 功能,但我真的更喜欢只用一个正则表达式来解决这个问题......它必须工作,但它没有 - 对于任何建议,我将非常感激。也许你描述了一个使用 DOM @hek2mgl 的解决方案?
-
@user3714751 我已使用
DOMDocument添加了答案。
标签: php regex preg-replace