一个关于 PHP 的问题大家帮解答下,问题发在 segmentfault 上了

2014-07-27 09:33:56 +08:00
 bufannao
问题 http://segmentfault.com/q/1010000000619000
@joyqi @Sunyanzi
3847 次点击
所在节点    问与答
35 条回复
haiyang416
2014-07-27 09:36:44 +08:00
好奇葩的需求,既然评论和选项是挂钩的,我觉得就不应该考虑随即选项。
bufannao
2014-07-27 09:39:52 +08:00
@haiyang416 随机选项是为了不让用户记忆性答题,评论功能也是必要的需求
大家帮帮忙,试试这个问题能否解决。
haiyang416
2014-07-27 09:41:52 +08:00
@bufannao 你的思路又问题,防止记题的方法应该加大题目量,然后随即选题,而不是随即选项。
bufannao
2014-07-27 09:47:56 +08:00
@haiyang416 不要纠结思路问题了吧,问题中的场景只是举个例子,实际需求就是类似问题这样,不一定是选择题,用选择题举例形象一些
raincious
2014-07-27 09:48:38 +08:00
看不出这个机制实现的意义。

如果需要实现的话,只能进行绑定。

首先,所有的答案都记录一个唯一标识(AID)。

然后写一个解析器(Javascript)来实时解析用户的输入并且给出选项让用户进行确认(确认真的是提到了那个选项),当检测到用户提及答案选项的时候(ABCD),将输入绑定在这个AID上(相当于“提到”功能,只是没有@符号,这也是难的地方)。

读取的时候,先取出问题和答案列,然后根据评论绑定的AID来再次解析用户输入,将内容替换到对应答案的友好序号。

你想通过纯后台实现目前个人感觉是不可能的,除非你能通过PHP这样缓慢的脚本语言来实现语言分析。
RemRain
2014-07-27 09:56:56 +08:00
我觉得这个问题可能无解,因为评论是用户对自己看到的现象的描述,而每个人看到的现象都是不一样的。比如人家评论了这么一条: I think a is not a right answer.
RemRain
2014-07-27 09:58:22 +08:00
或者这么一条:“答案不应该是C么。。。A_A”
bufannao
2014-07-27 10:13:22 +08:00
@RemRain 下面的正则能处理一些情况,但还不够

$_relation = array('A'=>'#1','B'=>'#2",'C'=>'#3','D'=>'#4');

$comment = preg_replace(
array(
'/([^A-Za-z0-9\“\”]+|^)\s*([a-eA-E\、\.\,\,\s]+)\s*([^A-Za-z0-9\“\”]+?|$)/iuesm',
),
array(
"'\$1'.(((strpos('$question', '\$2') === FALSE AND substr_count('$comment', '\$2') < 3) OR (strpos('$question', substr('\$1', -1).'\$2'.substr('\$3', 0, 1)) === FALSE AND preg_match('/(解析*|答案*|排*除|正确|对|错误*|选|项|是)/iues', '\$1\$2\$3'))) ? strtr(strtoupper('\$2'), $_relation) : '\$2').'\$3'",
),
$comment
);
RemRain
2014-07-27 10:15:59 +08:00
@bufannao 我给出的两个示例你处理的都不对
RemRain
2014-07-27 10:23:41 +08:00
I think a is not a right answer. -> I think D is not D right answer.

答案不应该是C么。。。A_A -> 答案不应该是B么。。。C_C

再来一条:I think the first answer is not right.

人对于同一现象的描述可以有很多种,你的需求保持语义不变,进行转换。但语义的分析程序很难达到大脑的程度,例如,“答案A”对应的说法有 第一个答案、第一个、第1个、first、1st、A(全角)、A(半角)等,很难进行枚举
foxwoods
2014-07-27 10:30:10 +08:00
需求包括以下两点:
1. 随机选项
每次显示的时候选项是随机变化的
2. 评论功能
评论中对选项有引用,在评论显示的时候引用随选项变化

第1点需求,把选项存数据库的时候不要按选项序号(ABCDE),而是按与序号无关的id存,把加序号的逻辑放在显示的部分就可以了。

第2点需求比较复杂,不容易做好。像 @raincious 说的一样,相当于“提到”功能。我觉得可以这样做:
1. 设计一种语法来引用选项,类似微博上的@, #, YouTube上的时间,因为有明确的格式以后不容易产生歧义。比如,可以用 [A] 来引用当前题目的选项A。
2. 在数据库存评论内容的时候,先保存用户输入的原文。
3. 用之前定义的引用选项的语法规则解析评论原文,得到当前上下文内,选项序号和选项ID的对应关系列表,把这个列表存到数据库
4. 在显示评论内容时,取出第2步和第3步的数据,再加上随机显示序号的逻辑,就可以显示出正确的评论了。
rming
2014-07-27 10:39:59 +08:00
楼上分析的这么复杂。。。
bufannao
2014-07-27 10:51:00 +08:00
@foxwoods 是的,分析用户的评论是难点,“设计一种语法来引用选项" 这个之前也想过,但是这个从用户体验上考虑怎么让用户习惯呢?比如在V2的回复框中,怎么让用户自己输入时把A B C D变成[A] [B] [C] [D]
rming
2014-07-27 11:00:34 +08:00
@bufannao 这个程序是不是“举一反三”的意思,那么不就是 “怎样打乱顺序,但是保留原索引”的问题么
foxwoods
2014-07-27 11:11:24 +08:00
@bufannao
我觉得,不应该是这样:
让用户自己输入时把A B C D变成[A] [B] [C] [D]

应该是这样:
让用户习惯输入[A] [B] [C] [D]

可以参考新浪微博和Twitter的@和#,Google Plus的+和#
bufannao
2014-07-27 11:16:13 +08:00
@rming 打乱和保留索引这是需求的一部分,实现较容易。在这个基础上还要把用户的评论根据索引关系提取出索引(选项)关键字,涉及语意,这个难度大,一直没搞定。
raincious
2014-07-27 11:18:19 +08:00
@foxwoods
@bufannao

那两个例子是有区别的。我举@的例子只是因为功能类似。

使用@,用户是有“得益”的,所以会被驱动而主动使用@。

如果从技术角度无法完美解决问题,不如从用户角度考虑,如何让用户在使用[A]的时候产生利益,从而主动去使用。
wavingclear
2014-07-27 11:21:48 +08:00
做题时随机选项
评论和看评论时用固定选项

反正做题的时候不能看评论,看了不就泄露答案了。
bufannao
2014-07-27 11:28:07 +08:00
@wavingclear 答题和评论这种连贯操作,选项的变化会让用户感觉不适。

@raincious 嗯,目前纠结技术角度是否真的无法解决。
jianghu52
2014-07-27 11:35:04 +08:00
评论这个部分已经涉及到了语境分析的问题了。这个东西除非有库配合,否则的话单靠php语言来分析,基本不太可能产生比较 [像人话] 的评论

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/124681

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX