Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在div中围绕希伯来语和英语文本_Javascript_Html_Regex - Fatal编程技术网

Javascript 在div中围绕希伯来语和英语文本

Javascript 在div中围绕希伯来语和英语文本,javascript,html,regex,Javascript,Html,Regex,我试图在一段中的希伯来语和英语句子周围添加一个span标记。例如。 “那么,怎么了?” 将成为: [span]so[/span][span]היי[/span][span]all whats up[/span][span]אתכם[/span] 我一直在尝试使用regexp,但它只是删除了希伯来语单词,并在一个跨度内加入了英语单词 var str = 'so היי all whats up אתכם?' var match= str.match(/(\b[a-z]+\b)/ig); var

我试图在一段中的希伯来语和英语句子周围添加一个span标记。例如。 “那么,怎么了?” 将成为:

[span]so[/span][span]היי[/span][span]all whats up[/span][span]אתכם[/span]
我一直在尝试使用regexp,但它只是删除了希伯来语单词,并在一个跨度内加入了英语单词

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>')
var-str='sow•ייייאתכם
var match=str.match(/(\b[a-z]+\b)/ig);
var replace=match.join().replace(match.join(),“”+match.join()+“”)
根据您的判断,您可以尝试以下操作:
((?:\s*\w++)+(?:\s*[\u0590-\u05FF]+)+(?=\s?[A-Za-z0-9!?])

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


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

我认为您需要的正则表达式类似于
[^a-z^\u0591-\u05F4^\s]
。我不完全确定您希望如何处理空间

我的解决方案

str
复制到新的var
res
,替换所有非a-Z/希伯来语的字符。
str
中的任何英文(a-z)字符上循环,并使用
res.replace
将它们包装在
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;
var str='so•יייייאתכם?';
var finalStr=str.replace(/([^a-z^\u0591-\u05F4^\s])/gi';
var rgx=/([a-z]+)/gi;
var mat=str.match(rgx);
对于(变量i=0;i

这里前面的答案没有说明整个单词的要求。事实上,很难做到这一点,因为
\b
单词边界不支持包含相邻希伯来语Unicode符号的单词边界,我们只能使用
\u
符号与字符类匹配

我建议使用look aheads和capturing group来确保我们捕获整个希伯来语单词(
(^ |[^\u0590-\u05FF])([\u0590-\u05FF]+)(?![\u0590-\u05FF])
,确保希伯来语单词之前有一个非希伯来语符号或字符串开头-如果希伯来语单词之间有空格,则添加一个
\s
),
\b[a-z\s]+\b
匹配用空格分隔的整个英语单词的顺序

如果您计划将
标记插入到围绕整个单词的句子中,以下函数可能会有所帮助:

var str='so•יייייאתכם?';
//var str=‘那么,怎么了?’;
var result=str.replace(/\s*(\b[a-z\s]+\b)\s*/ig,$1');
结果=结果。替换(/(^\u0590-\u05FF])([\u0590-\u05FF]+)(?![\u0590-\u05FF])/g,“$1$2”);
document.getElementById(“r”).innerHTML=result
span{
背景:#FFCCCC;
边框:1px实心#0000FF;
}

您的正则表达式似乎有误,它不包含任何希伯来语匹配,只包含[a-z]+,这当然是英语。如何正确操作?您可以尝试将希伯来语范围:[\u0590-\u05FF]添加到您的正则表达式中,这是unicode中的א-ת(match.join(),'+match.join()+'')//可能类似这样,检查它是否不是句子中第一个单词的最后一个,以便正确应用标记?只是个主意。不是很漂亮。这个问题。谢谢dave,你的解决方案很好,但它也会产生空的spansYeah,我想我的正则表达式可能有点不对劲。在调整finalStr之前,您可以始终检查
match.trim()
。e、 g.我认为为了完全模拟单词边界行为,可以将否定的希伯来文字符类扩展为不匹配数字和下划线:
(^\u0590-\u05FF0-9)([\u0590-\u05FF]+)
。我的解决方案对你有用吗?