V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
bufannao
V2EX  ›  问与答

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

  •  
  •   bufannao · 2014-07-27 09:33:56 +08:00 · 3860 次点击
    这是一个创建于 3776 天前的主题,其中的信息可能已经有所发展或是发生改变。
    35 条回复    2014-07-28 16:27:05 +08:00
    haiyang416
        1
    haiyang416  
       2014-07-27 09:36:44 +08:00
    好奇葩的需求,既然评论和选项是挂钩的,我觉得就不应该考虑随即选项。
    bufannao
        2
    bufannao  
    OP
       2014-07-27 09:39:52 +08:00
    @haiyang416 随机选项是为了不让用户记忆性答题,评论功能也是必要的需求
    大家帮帮忙,试试这个问题能否解决。
    haiyang416
        3
    haiyang416  
       2014-07-27 09:41:52 +08:00
    @bufannao 你的思路又问题,防止记题的方法应该加大题目量,然后随即选题,而不是随即选项。
    bufannao
        4
    bufannao  
    OP
       2014-07-27 09:47:56 +08:00
    @haiyang416 不要纠结思路问题了吧,问题中的场景只是举个例子,实际需求就是类似问题这样,不一定是选择题,用选择题举例形象一些
    raincious
        5
    raincious  
       2014-07-27 09:48:38 +08:00   ❤️ 2
    看不出这个机制实现的意义。

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

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

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

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

    你想通过纯后台实现目前个人感觉是不可能的,除非你能通过PHP这样缓慢的脚本语言来实现语言分析。
    RemRain
        6
    RemRain  
       2014-07-27 09:56:56 +08:00
    我觉得这个问题可能无解,因为评论是用户对自己看到的现象的描述,而每个人看到的现象都是不一样的。比如人家评论了这么一条: I think a is not a right answer.
    RemRain
        7
    RemRain  
       2014-07-27 09:58:22 +08:00
    或者这么一条:“答案不应该是C么。。。A_A”
    bufannao
        8
    bufannao  
    OP
       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
        9
    RemRain  
       2014-07-27 10:15:59 +08:00
    @bufannao 我给出的两个示例你处理的都不对
    RemRain
        10
    RemRain  
       2014-07-27 10:23:41 +08:00   ❤️ 1
    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
        11
    foxwoods  
       2014-07-27 10:30:10 +08:00   ❤️ 1
    需求包括以下两点:
    1. 随机选项
    每次显示的时候选项是随机变化的
    2. 评论功能
    评论中对选项有引用,在评论显示的时候引用随选项变化

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

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

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

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

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

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

    @raincious 嗯,目前纠结技术角度是否真的无法解决。
    jianghu52
        20
    jianghu52  
       2014-07-27 11:35:04 +08:00
    评论这个部分已经涉及到了语境分析的问题了。这个东西除非有库配合,否则的话单靠php语言来分析,基本不太可能产生比较 [像人话] 的评论
    wavingclear
        21
    wavingclear  
       2014-07-27 11:37:31 +08:00 via Android
    @bufannao 评论完刷新一下页面发现自己说的啊ABCD被系统给“改”了这个变化似乎更不适XDD
    如果允许评论下跟贴(楼中楼那种)用户会更混乱
    个人认为用户可以理解答题时随机打乱选项这件事,很难理解评论奇怪的输入选项的方式。
    答题时扭一下大家还是会回答,评论时别扭了那评论率不就少很多。
    wavingclear
        22
    wavingclear  
       2014-07-27 11:40:07 +08:00 via Android
    答题时换一个符号系统用数字,或者直接不显示ABCD,在网页上点击。
    dongk
        23
    dongk  
       2014-07-27 12:33:03 +08:00
    这个功能的设计有问题,基于有问题的设计去考虑算法没有意义。
    bufannao
        24
    bufannao  
    OP
       2014-07-27 12:47:49 +08:00 via Android
    @dongk 问题出在哪?
    barbery
        25
    barbery  
       2014-07-27 13:48:11 +08:00
    我觉得楼上有几个答案不错啊,评论的时候ABCD不要让用户输入,而是通过按钮让用户引用某个选项,每个答案的选项都有主键id,只要引用把id带上,在输出题目的时候,打乱下选项,把打乱后的选项存起来,输出评论时做下正则替换。。。
    zungmou
        26
    zungmou  
       2014-07-27 14:25:52 +08:00
    每个选项 A, B, C, D 都对应一个编号,例如: 1, 2, 3, 4,保存评论的同时,对评论内容作替换,只记录 1, 2, 3, 4 编号,加载答案时,再替换回来。无论怎么随机,都可以呈现。
    imn1
        27
    imn1  
       2014-07-27 16:55:23 +08:00
    无解,因为评论是自由发言,如果不是写“答案A有问题”,而是写“第一个答案有问题”呢?类推……

    建议写/显示评论有固定的顺序,且与答题分开,就是答题时随机其他时候固定
    而且答题前或答题中显示评论本来就有违“闭卷”原则
    solupro
        28
    solupro  
       2014-07-27 17:53:07 +08:00
    @barbery 如果用户能按照约定输入是没问题,但是总会有”搅局者“,比如上面 @RemRain 提到的 选项A 用户可能输入 第一个答案、第一个、第1个、first、1st、A(全角)、A(半角)等
    solupro
        29
    solupro  
       2014-07-27 17:59:35 +08:00
    想了想,能不能换个思路。用户评论不是归属哪个题目,而且归属哪题的哪个选项。
    barbery
        30
    barbery  
       2014-07-27 19:23:11 +08:00
    @solupro 不行,因为一个讨论里面会引用超过1个选项。。。
    对于这类问题只能把搅局者排除掉或者写多点正则尽可能的适配多的类型。。
    solupro
        31
    solupro  
       2014-07-27 19:31:03 +08:00
    @barbery 确实多选项是个问题
    micate
        32
    micate  
       2014-07-27 20:18:00 +08:00
    思路:
    1. 用户发表评论并提交时,一并提交用户看到的答案顺序(A -> 0001,B -> 002 ...);
    2. 后端接收到评论后,对该评论按照用户看到的顺序进行替换:A -> 0001,B -> 0002 ...;
    3. 输出评论到前台时,根据当前答案的顺序,比如 A -> 0002,B -> 0001,再将字母替换回来;

    这个输入和输出可能都需要些辅助字符:如用户输入的可能并不是 A,而是 #A;替换为的并不是 0001,而是有特殊前后缀的,比如 __0001__,只是为了可以分隔有效字符。

    同时可以结合前后端检测,比如当用户输入了系统可能分辨不出来的选项时,可以提示用户一些输入规范。

    针对用户会感觉混乱的问题:
    可以鼠标滑过 A、B 的时候,浮框显示 A、B 对应的答案,这需要替换的时候,包裹一些辅助标签,如 <span data-option="0001">A</span>
    kmvan
        33
    kmvan  
       2014-07-28 09:04:52 +08:00 via Android   ❤️ 1
    输入框弄个 abcd 按钮,让用户写答案评论时需要引用的选项点按钮引用,按钮输出 #a 这样。输出到前台的时候自动替换呗!这个我想应该是最优解决方案
    hisway
        34
    hisway  
       2014-07-28 09:41:02 +08:00   ❤️ 1
    1,引导用户使用#A,@A之类的方式对某个选项评论
    2,提交评论时保存下当前选项顺序
    3,随机时根据顺序替换#A,@A之类评论内容
    bufannao
        35
    bufannao  
    OP
       2014-07-28 16:27:05 +08:00 via Android
    @hisway
    @kmvan
    先感谢一下,你们对问题难度的理解还不够,难度在语意分析。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4389 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 10:14 · PVG 18:14 · LAX 02:14 · JFK 05:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.