div中的希伯来语和英文文本

时间:2015-07-03 08:36:51

标签: javascript html regex

我正试图在段落中添加希伯来语和英语句子的span标签。例如。  “所以היי所有什么都发生了吗?” 将成为:

[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>')

3 个答案:

答案 0 :(得分:9)

此前的答案未考虑整个字要求。实际上,很难实现这一点,因为\b字边界不支持与邻近的希伯来语Unicode符号的单词边界,我们只能使用\u表示法与字符类匹配。

我建议使用预测和捕捉小组,以确保我们捕获整个希伯来语单词(^|[^\u0590-\u05FF])([\u0590-\u05FF]+)(?![\u0590-\u05FF]),以确保在希伯来语单词之前有一个非希伯来语符号或字符串的开头 - 添加一个{{ 1}}如果希伯来语单词之间有空格!)和\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"/>

答案 1 :(得分:1)

我认为你想要的正则表达式就像[^a-z^\u0591-\u05F4^\s]。我不完全确定你想如何处理空间。

我的解决方案

str复制到新的res,替换任何不是A-Z /希伯来语的字符。
循环遍历str中的所有英语(a-z)字符,并使用span将其包装在res.replace中。
对希伯来字符再次做同样的事。

这不是100%,但IMO似乎运作良好。

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/

答案 2 :(得分:0)

根据this post判断,你可以尝试这样的事情:((?:\s*\w+)+|(?:\s*[\u0590-\u05FF]+)+?(?=\s?[A-Za-z0-9!?.])) https://regex101.com/r/kA3yV5/4

您可能需要针对特定​​情况对其进行编辑(例如,如果某些非单词字符开始出现),但它可以解决问题。它试图匹配英语字符列表中的单词和句子,如果它不起作用,它会尝试用希伯来字符列表制作单词/句子,直到再次发现英文字符。

它还不完美,因为你可能想要添加其他标点字符,并且在第一个位置有一些你不想要的空格(因为javascript不支持lookbehinds,我没想出一个好的方法来删除他们当场,但他们可以在位置1并从字符串中删除