2015-07-03 40 views
8

我想在段落中的希伯來語和英語句子周圍添加span標籤。例如。 「so all whats upאתכם?」 將變爲:環繞希伯來文和英文文本div

[span]so[/span][span]היי[/span][span]all whats up[/span][span]אתכם[/span] 

我一直在試圖用正則表達式但它只是去掉希伯來語單詞和一個跨度加入了英語單詞。

var str = 'so היי all whats up אתכם?' 
var match= str.match(/(\b[a-z]+\b)/ig); 
var replace = match.join().replace(match.join(),'<span>'+match.join()+'</span>') 
+1

您正則表達式似乎是錯誤的,它不包含任何希伯來語只匹配[AZ] +是,當然,英語 –

+0

所以如何做對吧? – roude

+3

您可以嘗試添加希伯來語範圍:[\ u0590- \ u05FF]到您的正則表達式中,這是unicode –

回答

0

通過this post來看,你可以嘗試這樣的事:((?:\s*\w+)+|(?:\s*[\u0590-\u05FF]+)+?(?=\s?[A-Za-z0-9!?.]))https://regex101.com/r/kA3yV5/4

您可能需要編輯就爲您的特定情況下(例如,如果一些非單詞字符開始出現),但它做的伎倆。它會嘗試從英文字符列表中匹配單詞和形式句子,如果它不起作用,它會嘗試將單詞/句子從希伯來字符列表中刪除,直到再次出現英文字符。

這還不完美,因爲你可能想要添加其他標點符號,並且在第一位有一些你不想要的空間(因爲javascript不支持lookbehinds,所以我沒有找到一個好辦法當場刪除它們,但它們可以在位置1並從字符串中刪除)

1

我認爲您想要的正則表達式類似於[^a-z^\u0591-\u05F4^\s]。我不完全確定你想如何處理空間。

我的解決方案

複製str到一個新的變種res,更換不屬於A-Z /希伯來語的任何字符。
使用res.replace循環使用str中的任何英文(a-z)字符並將它們包裝在span中。
爲希伯來字符再次做同樣的事情。

這不是100%,但似乎很好地運作國際海事組織。

var str = 'so היי all whats up אתכם?'; 
var finalStr = str.replace(/([^a-z^\u0591-\u05F4^\s])/gi, ''); 

var rgx = /([a-z ]+)/gi; 
var mat = str.match(rgx); 

for(var i=0; i < mat.length; ++i){ 
    var match = mat[i]; 
    finalStr = finalStr.replace(match.trim(),'<span>'+match.trim()+'</span>'); 
} 

rgx = /([\u0591-\u05F4 ]+)/gi; 
var mat = str.match(rgx); 

for(var i=0; i < mat.length; ++i){ 
    var match = mat[i]; 
    finalStr = finalStr.replace(match.trim(),'<span>'+match.trim()+'</span>'); 
} 

document.getElementById('res').innerHTML = finalStr; 

http://jsfiddle.net/daveSalomon/0ns6nuxy/1/

+0

感謝戴夫,你的解決方案效果很好,但它也創建空跨度 – roude

+0

是的,我認爲我的正則表達式可能有點關閉。在調整finalStr之前,你總是可以檢查'match.trim()'。例如http://jsfiddle.net/daveSalomon/0ns6nuxy/2/ –

9

上一頁答案在這裏沒有佔到整個單詞要求。事實上,這很難實現,因爲\b字邊界不支持與鄰居希伯來Unicode符號的字邊界,我們只能使用\u符號與字符類匹配。

我建議使用預見和捕獲組來確保我們捕獲整個希伯來文字((^|[^\u0590-\u05FF])([\u0590-\u05FF]+)(?![\u0590-\u05FF]),確保在希伯來文字前有非希伯來字符或字符串的開頭 - 如果有空格,則添加\s在希伯來詞之間!)和\b[a-z\s]+\b匹配用空格分隔的整個英語單詞的序列。

如果您計劃在<span>標籤插入圍繞整個單詞的句子,這裏是一個功能,可以幫助:

var str = 'so היי all whats up אתכם?'; 
 
//var str = 'so, היי, all whats up אתכם?'; 
 
var result = str.replace(/\s*(\b[a-z\s]+\b)\s*/ig, '<span>$1</span>'); 
 
result = result.replace(/(^|[^\u0590-\u05FF])([\u0590-\u05FF]+)(?![\u0590-\u05FF])/g, '$1<span>$2</span>'); 
 
document.getElementById("r").innerHTML = result;
span { 
 
    background:#FFCCCC; 
 
    border:1px solid #0000FF; 
 
}
<div width="645" id="r"/>

結果:

<span>so</span><span>היי</span><span>all whats up</span><span>אתכם</span>? 

如果在輸出中不需要任何標點符號或字母數字實體,只需連接整個英文和希伯來文單詞,然後使用

var str = 'היי, User234, so 222היי all whats up אתכם?'; 
 
var re = /(^|[^\u0590-\u05FF])([\u0590-\u05FF]+)(?![\u0590-\u05FF])|(\b[a-z\s]+\b)/ig; 
 
var res = []; 
 
while ((m = re.exec(str)) !== null) { 
 
    if (m.index === re.lastIndex) { 
 
     re.lastIndex++; 
 
    } 
 
    if (m[1] !== undefined) { 
 
     res.push('<span>'+m[2].trim()+'</span>'); 
 
    } 
 
    else 
 
    { 
 
     res.push('<span>'+m[3].trim()+'</span>'); 
 
    } 
 
    
 
} 
 
document.getElementById("r").innerHTML = res.join("");
span { 
 
    background:#FFCCCC; 
 
    border:1px solid #0000FF; 
 
}
<div width="645" id="r"/>

結果:

<span>היי</span><span>so</span><span>היי</span><span>all whats up</span><span>אתכם</span> 
+0

我認爲要完全模擬字邊界行爲,否定的希伯來字符類可以擴展爲不匹配數字和下劃線:'(^ | [^ \ u0590- \ u05FF0-9 _])([\ u0590- \ u05FF] +)'。我的解決方案適合你嗎? –

+0

它適合你嗎? –