【问题标题】:Find and Replace and a WYSIWYG Editor查找和替换以及所见即所得的编辑器
【发布时间】:2009-02-19 11:48:09
【问题描述】:

我的问题如下:

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

例如 - 假设这是 ProductName 的一部分:

其他文字..<strong>text text <font color="#ff6600">colortext®</font></strong>..其他文字

现在,用户想要替换:

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

原始名称中包含&lt;strong&gt; 标记,因此显示为粗体。所以用户把它加粗了——现在他正在搜索的文本是:

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

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

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

【问题讨论】:

    标签: html text


    【解决方案1】:

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

    编辑:路径是指类似于 XPath 或 TinyMCE 编辑器的路径概念的东西。示例:搜索文本的纯文本部分是“colortext®”。这个文本节点在搜索文本中的路径是&lt;strong&gt;/&lt;font color="#ff6600"&gt;。在文本正文中搜索相同的纯文本(平凡),并取其路径,也就是&lt;strong&gt;/&lt;font color="#ff6600"&gt;。 (比较一下“其他文本..”的路径/和“文本文本”的路径&lt;strong&gt;。)这两个路径是相同的,所以这是一个真正的匹配。如果您有 DOM 树表示,确定路径应该不难。

    【讨论】:

    • "取搜索文本部分的元素路径" 我不太明白你想说什么。你能举一个简短的例子吗?
    【解决方案2】:

    您需要几个相关但离散的能力:

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

    您应该分步进行 - 否则它会变得不堪重负,并且一个搜索算法将无法在不付出巨大努力的情况下完成所有三个操作,从而导致代码难以维护。

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

    一旦你开始工作,它就会成为你搜索堆栈中的一层。

    其次,查看格式搜索。这通常使用标记或标签来完成 - 您已经以 HTML 的形式拥有。但是,您必须能够处理乱序的事情 - 所以&lt;b&gt;&lt;i&gt;text&lt;/i&gt;&lt;/b&gt; 需要在搜索&lt;i&gt;&lt;b&gt;text&lt;/b&gt;&lt;/i&gt; 和标签未正确嵌套的格式错误的表示中被捕获,例如&lt;b&gt;&lt;i&gt;text&lt;/b&gt;&lt;/i&gt;

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

    现在您可以将字母及其样式哈希与您的搜索进行比较,并获得格式和内容匹配。将其叠加在您的类似匹配之上,您就有了您需要的东西。

    -亚当

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

        不确定是否理解您所说的所有内容,但使用正则表达式似乎是解决您所说的问题的好方法。

        【讨论】:

        • 我需要一个这样的例子。
        • 啊,他现在有两个问题。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多