2009-05-05 64 views
4

我想HTML自動和邏輯地轉義一個特定的短語,目前是一個單詞用雙引號加亮的語句。在聲明中,報價或英寸標記也可用於描述距離。HTML轉義 - Reg表達式?

這句話可能是:

保羅說:「這錯過我們通過約一英尺。」事實上,只有約9" 。

爲了逃避這句話它真正應該

<pre>Paul said &ldquo;It missed us by about a foot&rdquo;. 
In fact it was only about 9&prime;.</pre> 

其中給出

<pre>Paul said 「It missed us by about a foot」. 
    In fact it was only about 9″.</pre> 

我想不出一個樣品短語添加在一個「逃避,但也可能在那裏!

我正在尋找一些關於如何識別在運行時替換「字符的轉義值的幫助。這個短語只是一個例子,它可以是任何東西,但應該正確地形成,即開始和結束報價如果我們要正確地轉義文本,將會出現

我會使用正則表達式在文本中找到引用的短語,例如,在完全停止之前找到兩個「」字符,然後替換第一個,然後替換第一個和

&ldquo; 

然後

&rdquo;  

如果我找到一個「有 "
替換它,除非它是一個號碼後,我與

&Prime; 

取代它我將如何處理多個引號句子中?

"It just missed" Paul said "by a foot".

這真是難倒我.....

<pre>"It just missed" Paul said "by 9" almost".</pre> 

正確轉義時,以上應閱讀。 (我展示的實際字符這段時間)

「It just missed」 Paul said 「by 9″ almost」.

顯然邊緣的情況下,但我不知道是否有可能逃離這個在運行時沒有內容的理解?如果對更明顯的短語不會有所幫助,將不勝感激。

回答

0

你可以嘗試這樣的事情。首先替換正則表達式的報價:

"((?:[^"\d]+|\d"?)*)" 

,比英寸的標誌:

(\d+)" 

下面是JavaScript的一個例子:

'"It just missed" Paul said "by 9" almost"'.replace(/"((?:[^"\d]*|\d["']?)+)"/g, "&ldquo;$1&rdquo;").replace(/(\d+)"/g, "$1&Prime;"); 
1

你所描述的是基本上是隱藏馬爾可夫模型,

http://en.wikipedia.org/wiki/Hidden_Markov_model

您有一組輸入符號(您的原始文本和不明確的標點符號)以及一組輸出符號(原始文本和更細粒度的標點符號),但沒有一個好的方式來真正觀察程序中兩者之間的連接辦法。你可以編寫一些規則來涵蓋一些邊緣情況,但這基本上不適用於多引號情況。在這種情況下,出於同樣的原因你不能真正使用正則表達式,但是用一個HMM和一堆訓練文本,你可能會做出一些相當不錯的猜測。

對不起,這可能不是非常有用,如果你試圖做好部署準備工作,但輸入比輸出有更多的含糊不清,所以你唯一的選擇是考慮上下文,這基本上意味着要麼很長一套規則或某種機器學習方法。

雖然有趣的問題 - 看看你能得到什麼樣的表現是很好的。也許有人已經寫了一篇論文呢?

1

我想知道是否有可能在運行時跳過 而沒有 瞭解內容?

考慮到您將語義含義添加到當前編碼在其他文本中的標點符號......不,不是。

正則表達式將是最簡單的工具,至少它的一部分。我建議在英寸數字的情況下查找/ \ d +「/,但對於引號分隔符,在查找其他特殊情況或短語後,使用匹配對的算法可能會更容易,例如括號和支架:記號化和計數然後在真實世界的輸入測試和改進

但我真的要問:?爲什麼

3

我會分兩次做到這一點:

第一遍搜索對於任何緊接在數字前面並且進行替換的人:

s/([0-9])"/\1&Prime;/g

根據您處理的文本,您可能需要/需要擴展此正則表達式以識別拼寫爲單詞的數字;爲了簡單起見,我只檢查數字。

與所有那些照顧,第二遍就可以很容易地轉換對「S爲你所描述:

s/"([^"]*)"/&ldquo;\1&rdquo;/g

注意使用[^"]*而非.* - 我們要找到兩組雙引號,它們之間有任意數量的非雙引號字符。通過添加該限制,處理具有多引號段的字符串將不會出現任何問題(也可以使用非引號段-greedy .*?,但一個否定的角色類更清楚地表明你的意圖d,在大多數正則表達式實現中,效率更高)

一個流浪,不匹配的字符串中的某個位置,或者第一遍錯過的英寸標記當然可能會導致問題,但是沒有辦法爲了避免這種可能性而不理解內容。

+0

+1先做Prime符號。這正確處理了「通過9」幾乎「的情況。 – 2009-05-05 12:20:26

1

我不確定在沒有理解句子意思的情況下是否可以這樣做。我傾向於懷疑它。

我的第一次嘗試是以下。

  • 由左到右通過串
  • 相間左右雙引號代替雙質數,但隨着雙撇號代替,如果有一個數向左
  • 如果引號是不平衡在字符串的末尾返回,直到找到具有雙素數的數字,並根據前面的雙引號將雙素數更改爲左或右雙引號。

我很肯定你很容易就會失敗這個策略。但它仍然是一個簡單的例子 - 當你必須處理嵌套引號時,艱苦的工作就開始了。

1

我知道這是關閉的,但你有沒有考慮過Mechanical Turk?這是人類擅長的問題,而電腦目前在這方面非常糟糕。選擇正確的標點符號需要理解句子的含義,所以正則表達式必然會在邊緣情況下失敗。