代码之家  ›  专栏  ›  技术社区  ›  sirrocco

查找和替换以及所见即所得编辑器

  •  1
  • sirrocco  · 技术社区  · 16 年前

    我的问题是:

    我有一个专栏:产品名称。现在,这里输入的文本是从tinymce输入的,所以它有各种各样的标签。用户希望能够在所有产品上进行查找和替换,并且必须支持着色。

    例如,假设这是产品名称的一部分:

    其他文本… <strong>text text <font color="#ff6600">colortext&reg;</font></strong> 其他文本

    现在,用户希望替换:

    <font color="#ff6600">colortext&reg;</font>
    

    原来的名字有 <strong> 在里面加上标签,使它看起来粗体。因此,用户将其设置为粗体-现在他正在搜索的文本是:

    <strong><font color="#ff6600">colortext&reg;</font></strong>
    

    显然我找不到。另外还有空间的问题:在一个地方,它在另一个地方有一个空间,它没有。

    有没有办法克服这个问题?

    4 回复  |  直到 10 年前
        1
  •  2
  •   David Hanak    15 年前

    从搜索文本中删除HTML标记,然后首先执行纯文本搜索。然后,一部分一部分(即文本节点一个文本节点),取搜索文本部分的元素路径,并与找到的文本中的对应部分进行比较。如果所有部分的路径都匹配,就完成了。

    编辑 :在path中,我指的是类似于xpath或tinymce编辑器的path概念。示例:搜索文本的纯文本部分是“colorText®”。搜索文本中此文本节点的路径为 <strong>/<font color="#ff6600"> . 在文本正文中搜索相同的纯文本(普通文本),并采用它的路径,这也是 <STRONG>/<FONT color=“ff6600”> . (将其与“其他文本…”的路径进行比较,后者是 / ,和“文本文本”,即 <strong> 两条路径是相同的,所以这是一个真正的匹配。如果您有一个DOM树表示,那么确定路径并不困难。

        2
  •  1
  •   Adam Davis    15 年前

    你要的是一些相关的,但不连续的能力:

    • 搜索和替换内容
    • 搜索和替换格式
    • 搜索和替换相似的(即忽略空白中的细微差别)

    你应该采取步骤-否则它将变得势不可挡,一个单一的搜索算法将无法做到这三个不需要紧张的努力,并导致难以维护代码。

    首先,看看类似的问题。进行忽略空格和大小写的搜索。如果你还需要处理“碗”与“碗”以及“智能”与“智能”,你可能会想要进入Lucene或其他搜索引擎技术,尽管我预计这超出了你目前的需求。

    一旦你完成了这项工作,它就会成为你的搜索堆栈中的一层。

    第二,查看格式搜索。这通常是通过使用标记或标记来完成的,而这些标记或标记是以HTML的形式存在的。但是,你必须能够不按顺序处理事情-所以 <b><i>text</i></b> 需要在搜索中捕获 <i><b>text</b></i> 以及不正确嵌套标记的格式错误的表示,例如 <b><i>text</b></i> .

    其中一种方法是预先解析字符串并将格式样式应用于每个字符。所以你会有一个粗体和斜体的t,粗体和斜体的e,等等。为了使这个更容易和更快,使用哈希来表示样式组合-读取第一个字符,找出它是什么样式(跟踪这个打开和关闭样式的过程,你会找到标签),如果它已经存在于哈希中,把这个哈希数分配给Letter.如果没有,则获取新的哈希数并分配它。

    现在,您可以将字母及其样式散列与搜索结果进行比较,并获得格式和内容匹配。把它堆在你相似的火柴上面,你就得到了你需要的。

    -亚当

        3
  •  1
  •   Jon W    15 年前

    如果它是有效的XML,那么对于这种练习来说,XSLT是微不足道的。 使用标识模板,然后添加xpath以查找所需的特定节点:

    <xsl:template match="//strong/font">
        <xsl:copy>
            <!-- Insert the replacement text here -->
        </xsl:copy>
    </xsl:template>
    

    使用XML时,这将是一个可维护、可扩展的解决方案。

        4
  •  -1
  •   claf    16 年前

    不一定能理解你所说的每一句话,但是使用正则表达式似乎是克服你所说问题的一个好方法。