【问题标题】:Replace words of text area替换文本区域的单词
【发布时间】:2014-06-19 09:59:48
【问题描述】:

我制作了一个 javascript 函数来将文本区域中的某些单词替换为其他单词,但它不起作用。我做了这个:

function wordCheck() {
    var text = document.getElementById("eC").value;
    var newText = text.replace(/hello/g, '<b>hello</b>');
    document.getElementById("eC").innerText = newText;
}

当我提醒变量 newText 时,控制台说该变量不存在。
谁能帮帮我?

编辑:
现在它替换了单词,但它用 b>hello/b> 替换了它,但我想让它加粗。有解决办法吗?

【问题讨论】:

  • 请注意,这只会替换文本区域中的第一个hello。如果要全部替换,则必须使用带有/g 修饰符的正则表达式。

标签: javascript regex replace words


【解决方案1】:

更新:
作为对您的编辑的回应,您希望看到单词 “hello” 以粗体显示。对此的简短回答是:无法做到。至少不在一个简单的文本区域中。您可能正在寻找更像在线 WYSIWYG 编辑器的东西,或者至少是 RTE(富文本编辑器)。其中有几个,例如like tinyMCE,这是一个不错的所见即所得编辑器。 RTE 和 HTML 编辑器列表can be found here。

首先:正如其他人已经指出的那样:textarea 元素的内容可通过其value 属性获得,而不是innerText。你得到的内容正常,但你试图通过错误的属性来更新它:在这两种情况下都使用value。

如果您想替换 所有 出现的字符串/单词/子字符串,则必须使用正则表达式,使用 g 修饰符。我还建议使匹配不区分大小写,以替换 "hello"、"Hello" 和 "HELLO" 都一样:

var txtArea = document.querySelector('#eC');
txtArea.value = txtArea.value.replace(/(hello)/gi, '<b>$1</b>');

如您所见:我捕获了匹配项,并在替换字符串中使用了它,以保留用户可能使用的大写字母。

但是等等,还有更多:

如果由于某种原因,输入已经包含&lt;b&gt;Hello&lt;/b&gt;,或者包含一个包含字符串“hello”的单词,例如“公司叫hellonearth?” 输入条件匹配(又名环视断言)和单词边界:

txtArea.value = txtArea.value.replace(x.value.replace(/(?!>)\b(hello)\b(?!<)/gi, '<b>$1</b>');

fiddle

它是如何工作的:

  • (?!&gt;):仅在前面没有 &gt; 字符的情况下匹配其余部分(更具体地说,如果您想使用 (?!&lt;b&gt;)。这称为负前瞻
  • \b:单词边界,以确保我们不匹配单词的一部分
  • (hello):匹配并捕获字符串文字,前提是(如上所述)它 not 前面有 &gt; 并且有一个单词边界
  • (?!&lt;):同上,只是现在我们不想找到匹配的&lt;/b&gt;,所以你可以用更具体的(?!&lt;\/b&gt;)替换它
  • /gi:影响整个模式的修饰符或标志:g 用于全局(意味着此模式将应用于整个字符串,而不仅仅是单个匹配)。 i 告诉正则表达式引擎模式是 case-insensitive,即:h 匹配大小写字符。

替换字符串&lt;b&gt;$1&lt;/b&gt;:当替换字符串包含$n子字符串时,其中n是一个数字,它们被视为反向引用。正则表达式可以将匹配分组为不同的部分,每个组都有一个数字,从 1 开始,具体取决于您有多少组。我们只对模式的一部分进行分组,但假设我们这样写:

'foobar hello foobar'.replace(/(hel)(lo)/g, '<b>$1-$2</b>');

输出将是"foobar &lt;b&gt;hel-lo&lt;/b&gt; foobar",因为我们已将匹配分成两部分,并在替换字符串中添加了一个破折号。
我想我将把对RegExp 的介绍留在那里......即使我们只触及了表面,我认为现在很清楚正则表达式的强大程度。花一些时间和精力来了解更多关于这个神奇工具的信息,这是非常值得的。

【讨论】:

    【解决方案2】:

    如果&lt;textarea&gt;,则需要使用.value属性。

    document.getElementById("eC").value = newText;
    

    而且,正如 Barmar 所提到的,replace() 仅替换第一个单词。要替换所有单词,您需要使用简单的正则表达式。请注意,我删除了引号。 /g 表示全局替换。

    var newText = text.replace(/hello/g, '<b>hello</b>');
    


    但是如果你想真正加粗你的文本,你需要使用内容可编辑的 div,而不是文本区域:
    <div id="eC" contenteditable></div>
    

    那么你需要访问innerHTML:

    function wordCheck() {
        var text = document.getElementById("eC").innerHTML;
        var newText = text.replace(/hello/g, '<b>hello</b>');
        newText = newText.replace(/&lt;b&gt;&lt;b&gt;/g,"&lt;b&gt;");//These two lines are there to prevent <b><b>hello</b></b>
        newText = newText.replace(/&lt;\/b&gt;&lt;\/b&gt;/g,"&lt;/b&gt;");
        document.getElementById("eC").innerHTML = newText;
    }
    

    【讨论】:

    • 谢谢,它有效!但我想让文本加粗,但现在它显示 hello 不是粗体。
    • @user3722860:我已经更新了我的答案......简单的答案是它不能真正使用简单的文本区域来完成。至少不容易。已经有相当多的开放、免费和经过验证的编辑器可用。我在我的答案中添加了一些链接。检查这些以找到最适合您需求的内容
    • @user3722860 已编辑。有效吗?
    • @nicael:是的,我做到了,但是既然有更强大的工具现成可用,为什么还要开发另一个基本的 RTE。 CKEditor 可以定制为完全符合 OP 的要求,而无需开发整个东西。如果您可以偷懒,请不要愚蠢,这就是为什么我强烈建议使用已经存在的代码
    • 我必须使用文本区域,因为我必须在其中输入,然后颜色更改或变为粗体,这可能吗?
    猜你喜欢
    • 2014-12-07
    • 1970-01-01
    • 2023-01-29
    • 2020-05-05
    • 2015-01-23
    • 1970-01-01
    • 1970-01-01
    • 2011-04-27
    • 2010-11-30
    相关资源
    最近更新 更多