【问题标题】:Regex hashtag in contenteditable div not working properlycontenteditable div 中的正则表达式主题标签无法正常工作
【发布时间】:2014-01-20 00:50:20
【问题描述】:

如何在用户键入时将内容可编辑 div 中以 # 字符开头的所有单词的颜色更改为蓝色。它现在所做的就是为所有匹配着色,但前提是它们出现在不匹配的单词之后。像这样:

#liferandomness #deathmore nothing #trees

但这不起作用:

我吃了一个苹果#yum#doctoraway#healthy#diet

这是一个小提琴: http://jsfiddle.net/GEm75/

我现在的做法是将每个匹配项包装在一个跨度中,然后使用 css 对其进行样式设置。我遇到了一个问题,主题标签后的不匹配文本仍然与主题标签颜色相同。我解决了这个问题,但效率很低,我非常想要一个替代方案。 这是我的代码:

<div id="box" style="border: 1px solid black; height: 10em" contenteditable="true">
</div>

function placeCaretAtEnd(el) {
el.focus();
if (typeof window.getSelection != "undefined"
    && typeof document.createRange != "undefined") {
    var range = document.createRange();
    range.selectNodeContents(el);
    range.collapse(false);
    var sel = window.getSelection();
    sel.removeAllRanges();
    sel.addRange(range);
} else if (typeof document.body.createTextRange != "undefined") {
        var textRange = document.body.createTextRange();
        textRange.moveToElementText(el);
        textRange.collapse(false);
        textRange.select();
    }
}

var inp = $('#box');
//select the box div
var text = '';
//#box's default value
inp.on('keyup', function(e) {
    text = inp.html();
    var matches_hash = text.match(/(^|\s)#(\w+)/g);
    if (matches_hash) {
        text = text.replace(/(^|\s)#(\w+)/g, "</span><span class='hashtag'> #$2</span><span class='else'>");
        inp.html(text);
        placeCaretAtEnd(document.getElementById('box'));
    }
});
</script>

我想知道是否有更有效的方法来做到这一点。还有主题标签必须用非主题标签文本分隔的问题。我通过一个正则表达式测试器运行了我的正则表达式,它运行良好。

http://regex101.com/r/iF3iZ8

函数placeCaretAtEnd(el) 是别人做的,我没做。但它所做的只是将插入符号放在可编辑 div 的末尾。

如果你有任何问题,请给我留言

请帮帮我。

【问题讨论】:

  • 这个问题非常非常非常非常笼统。根本没有答案。你在做什么?你的架构是什么?您要为此提供“语言”吗?你做过什么吗?
  • 恕我直言,如果您不确定自己需要哪种语言,那么 a) 不确定我们要指导您的方向 b) 您的技能水平可能不够高,抱歉!您可能想开始学习 PHP....
  • 我编辑了我的问题,现在它更相关且更容易回答。请解开我的问题。

标签: javascript php jquery contenteditable hashtag


【解决方案1】:

有很多方法可以做到这一点,但这是一种方法背后的想法。希望它能让您的创意源源不断。

设置一个关系数据库(可能是MySQL)并创建一个post 表来存储帖子。假设post 表有这些字段:

integer unsigned auto increment primary key id
timestamp posted
integer unsigned user_id
text comment

现在,您需要创建另一个表来存储主题标签。让我们称之为hashtag 并使用这个结构:

integer unsigned auto increment primary key id
integer unsigned post_id
text tag

hashtag 表中的post_id 会将您指向主题标签所属的post 行。现在,在 MySQL 中,您可以运行以下查询:

SELECT post.* FROM hashtag LEFT JOIN post ON post.id = post_id WHERE tag = "life"

此查询将获取所有带有“生活”主题标签的帖子。

【讨论】:

  • 谢谢。但我将如何突出显示链接。在 Facebook 上,只要您在状态中写下#life,它就会在其周围放置一个蓝色框。我该怎么做?
  • 使用 Javascript 在以“#”开头的单词周围添加&lt;a&gt; 标签。然后使用 CSS 将链接样式设置为您想要的颜色/字体。
猜你喜欢
  • 2013-05-17
  • 1970-01-01
  • 2012-05-25
  • 2016-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多