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

rou*_*ude 8 html javascript regex

我试图在段落中添加希伯来语和英语句子的span标签.例如"所以היי所有什么都是אתכם?" 会变成 :

[span]so[/span][span]???[/span][span]all whats up[/span][span]????[/span]
Run Code Online (Sandbox Code Playgroud)

我一直在尝试使用正则表达式,但它只是删除希伯来语并在一个范围内加入英语单词.

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>')
Run Code Online (Sandbox Code Playgroud)

Wik*_*żew 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;
Run Code Online (Sandbox Code Playgroud)
span {
    background:#FFCCCC;
    border:1px solid #0000FF;
}
Run Code Online (Sandbox Code Playgroud)
<div width="645" id="r"/>
Run Code Online (Sandbox Code Playgroud)

结果:

<span>so</span><span>???</span><span>all whats up</span><span>????</span>?
Run Code Online (Sandbox Code Playgroud)

如果您的输出中不需要任何标点符号或字母数字实体,只需连接整个英语和希伯来语单词,然后使用

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("");
Run Code Online (Sandbox Code Playgroud)
span {
    background:#FFCCCC;
    border:1px solid #0000FF;
}
Run Code Online (Sandbox Code Playgroud)
<div width="645" id="r"/>
Run Code Online (Sandbox Code Playgroud)

结果:

<span>???</span><span>so</span><span>???</span><span>all whats up</span><span>????</span>
Run Code Online (Sandbox Code Playgroud)


And*_*sts 0

这篇文章来看,你可以尝试这样的事情:((?:\s*\w+)+|(?:\s*[\u0590-\u05FF]+)+?(?=\s?[A-Za-z0-9!?.])) https ://regex101.com/r/kA3yV5/4

您可能需要针对特定​​情况对其进行编辑(例如,如果一些非单词字符开始出现),但它确实有效。它尝试从英语字符列表中匹配单词并形成句子,如果不起作用,它会尝试从希伯来语字符列表中匹配单词/句子,直到再次发现英语字符。

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