将以@符号开头的单词替换为jQuery

Replace word starting with @ symbol with jQuery

提问人:Elena 提问时间:12/26/2020 最后编辑:wazzElena 更新时间:12/26/2020 访问量:90

问:

当有人编写@NameHere时,我正在尝试创建一个链接,但使用我的实际代码它不起作用。该代码不会将 $1 读取为 @ 之后的单词。如果我在代码(like )后面放置一个空格,它会这样做,但随后它会将标点符号作为所提及名称的一部分。如果没有空格 (),则不会读取该单词。/^@(.*?)/ig /^@(.*?)/ig

我一直在尝试修复,但不知道如何修复。

https://jsfiddle.net/ElenaMcDowell/pebjtwrz/79/

<div class="previewDocument-box">
    <h1>Preview</h1>
    <div class="previewDocument-text"></div>
</div>
<textarea id="ECEditor" class="editor-textarea" style="height: 200px;" name="editor-text"></textarea>

$('#ECEditor').on('input', function() {
     var text = $(this).val();
     var bb =  [
            /\[b\](.*?)\[\/b\]/ig,
        /^@(.*?)/ig
        
    ];
    
    var bb_html = [
            '<strong>$1</strong>',
        '<a class="MLPrev" href="profile?id=$1">@$1</a>&nbsp;'
    ];
 
    for (var i =0;i<bb.length;i++) {
      text = text.replace(bb[i], bb_html[i]);
    }
     $('.previewDocument-text').html(text);
  });
jQuery 解析 替换 HTML 解析

评论

0赞 Sebastian Simon 12/26/2020
.*?匹配 0 个或更多字符,尽可能少。当然,如果你在它后面不提供分隔符,它将不匹配任何东西,例如.(?:\s|$)

答:

1赞 costaparas 12/26/2020 #1

看来您真正需要的是以下内容:

/@(\w+)(\b)/g

这将匹配一系列“单词”字符,后跟一个“单词边界”(本质上是一个非单词字符,例如空格或标点符号,或行尾)。

的使用是多余的,所以我已经从比赛中删除了它。i

请注意,我们也不会将匹配项锚定到行首,因为如果标记出现在文本中间,这将不起作用。

然后,您的替代品将变为:

'<a class="MLPrev" href="profile?id=$1">@$1</a>$2'

(这是一样的,只是我们没有插入不间断的空格,而是插入标签后面的任何字符 - 无论是空格或标点符号,还是其他“非单词”字符)。

下面是一个工作片段:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>Example</title>
</head>
<body>

  <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

  <div class="previewDocument-box">
    <h1>Preview</h1>
    <div class="previewDocument-text"></div>
  </div>

  <textarea id="ECEditor" class="editor-textarea" style="height: 200px;" name="editor-text"></textarea>

  <script type="text/javascript">
    $('#ECEditor').on('input', function() {
      let text = $(this).val();
      const bb = [
        /\[b\](.*?)\[\/b\]/g,
        /@(\w+)(\b)/g
      ];

      const bb_html = [
        '<strong>$1</strong>',
        '<a class="MLPrev" href="profile?id=$1">@$1</a>$2'
      ];

      for (let i = 0; i < bb.length; i++) {
        text = text.replace(bb[i], bb_html[i]);
      }
      $('.previewDocument-text').html(text);
    });
  </script>

</body>
</html>

此外,这种方法可确保在键入时标记是超链接的,而不是强制用户在之后插入某些内容(例如空格或标点符号)。因此,如果标签出现在行的末尾,它也会起作用。

评论

1赞 Elena 12/26/2020
非常感谢您的帮助,并花时间以易于理解的方式解释它,我真的很感激!