2009-02-19 71 views
1

我的問題如下:查找和替換和所見即所得編輯器

我有一列:ProductName。現在,這裏輸入的文本是從tinyMCE輸入的,因此它具有各種標籤。用戶希望能夠在所有產品上進行查找和替換,並且必須支持着色。

例如 - 讓我們說這是一個產品名稱的一部分:

其他文本.. <strong>text text <font color="#ff6600">colortext&reg;</font></strong> ..other文本現在

,用戶想更換:

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

原始名稱中有<strong>標記,因此它顯示爲粗體。因此,用戶使它粗體 - 現在他正在搜索的文本是:

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

顯然我不會找到它。另外還有空間的問題:在一個地方它有一個空間,而另一個空間不是。

有沒有辦法解決這個問題?

回答

2

從搜索文本中剝離HTML標籤並首先進行純文本搜索。然後,逐個部分(即通過文本節點的文本節點),獲取搜索文本部分的元素路徑,並將它們與找到的文本中的對應部分進行比較。如果所有部件的路徑匹配,就完成了。

編輯:通過路徑,我的意思是類似於XPath,或TinyMCE編輯器的路徑概念。例如:搜索文本的純文本部分是「colortext & reg;」。該文本節點在搜索文本中的路徑是<strong>/<font color="#ff6600">。搜索文本正文中的相同純文本(不重要),並取其路徑,這也是<strong>/<font color="#ff6600">。 (將其與「other text ..」(/)和「text text」(<strong>)的路徑進行比較。)這​​兩條路徑是相同的,所以這是真正的匹配。如果你有一個DOM樹表示,確定路徑應該不是困難的。

-1

不確定要理解你所說的一切,但使用正則表達式似乎是克服你所說的問題的好方法。

+0

我需要一個例子。 – sirrocco 2009-02-19 15:07:32

+1

啊,現在他有兩個問題。 「 – Albert 2009-02-19 16:02:12

1

如果它是有效的XML,對於這種練習來說,XSLT是微不足道的。 使用的身份模板,然後添加一個XPath找到你想要的特定節點:

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

當使用XML,這將是一個可維護,可擴展的解決方案。

1

你問了幾個相關的,但是獨立,能力:

  • 搜索和替換內容
  • 搜索和替換格式
  • 搜索和替換類似(即忽略空白微不足道的差異)

你應該採取這一步驟 - 否則它會變得壓倒性的,一個單一的搜索算法將無法完成所有三個不經過緊張的努力和resul難以維護代碼。

首先,看看類似的問題。進行忽略空格和大小寫的搜索。如果您還需要處理「碗」與「碗」,「智能」與「智能」,您可能想要進入Lucene或其他搜索引擎技術 - 儘管我預計這超出了您當前的需求。

一旦你有這個工作,它會成爲你的搜索堆棧中的一個層次。

其次,看格式搜索。這通常是使用令牌或標籤完成的 - 您已經擁有HTML格式的標籤或標籤。但是,您必須能夠處理不按順序的事情 - 因此需要在搜索<i><b>text</b></i>時搜索<b><i>text</i></b>,並在標記嵌套不正確的情況下執行格式錯誤的表示,例如<b><i>text</b></i>

這樣做的一種方法是預解析字符串並將格式樣式應用於每個字符。所以你可以用粗體和斜體,粗體和斜體等,以便更容易和更快地使用散列來表示樣式組合 - 讀取第一個字符,找出它的樣式(跟蹤這將打開和關閉樣式,並且您可以找到標籤),如果它已經存在於散列中,則將該散列號分配給該字母。如果沒有,請獲取新的散列號並分配它。

現在您可以比較字母及其樣式哈希與您的搜索並獲得格式和內容匹配。堆疊在類似的比賽之上,你有你需要的東西。

-Adam