解析获取的主题标签并创建 "svelte-routing" 链接

Parse fetched hashtags and create "svelte-routing" links

我正在从服务器获取可以包含主题标签的动态内容:

{content:" text text #Cup "}

正在做:

<script>
  import { link } from "svelte-routing"
    
    function hash(text) {
      return text.replace(/\#Cup/, '<a href="cup" use:link>Cup</a>')
  }
</script>

<p>
    {hash("this is a #Cup")}
</p>
<p>
    {@html hash("this is a #Cup")}
</p>

第二种方式将按原样呈现它(不连接到 svelte-routing 动作或事件)。

如何变成“精巧路由”'use:link' 元素? (或工作<Link to={cup}/>

编辑: 我将最佳答案更改为@pushkine。 原因是它需要较少的字符串清理,同时保留 link 标签的能力,如下所示:

 {first}
    {#each arr as { href, str }}
        <a href={href.toLowerCase()} use:link>{href}</a>
        {str}
    {/each}
<script>
    import { link } from 'svelte-routing';
    let str = 'this is a #Cup';
    const [first, ...arr] = str.split(/\#/g).map((v, i) => {
        if (i === 0) return v;
        else {
            const index = v.indexOf(' ');
            return { href: index !== -1 ? v.slice(0, index + 1) : v, str: index !== -1 ? v.slice(index) : '' };
        }
    });
</script>

<p>
    {@html first}
    {#each arr as { href, str }}
        <a href={href.toLowerCase()} use:link>{href}</a>
        {@html str}
    {/each}
</p>

您可以使用 links 操作而不是 link 操作。

<script>
  import { links } from "svelte-routing"

  const hashtags = text => text.replace(/(#([\w]+))/g, '<a href="/tags/"></a>');
</script>

<p use:links>
    {@html hashtags("this is #just a #Cup")}
</p>

请记住,此字符串未转义。因此,使用此解决方案可以插入 html 标记并执行 XSS 攻击。

svelte-routing 有一个 use:links 可以添加到父容器的操作:

<script>
  import { links } from "svelte-routing"
        
  function hash(text) {
      return text.replace(/\#Cup/, '<a href="cup">Cup</a>')
  }
</script>
    
<p use:links>
    {@html hash("this is a #Cup")}
</p>