Javascript:RegExp土耳其字符问题

时间:2016-04-05 16:35:51

标签: javascript jquery html

我正在研究javascript搜索功能。 RegExp '\\b('+word+')\\b', 'ig'用于选择和获取位置设置字词,但它只选择英文字符,不选择土耳其字符或任何内容。

  

工作脚本:https://jsfiddle.net/kv4jftcz/2/

     

不要工作脚本:https://jsfiddle.net/kv4jftcz/3/

2 个答案:

答案 0 :(得分:4)

您需要将RegExp与u标记一起使用,但javascript不支持unicode正则表达式:(因此要解决此问题,您应该重新定义\b\ba表示[^\w]a所以对土耳其人来说;

[^\wığüşöçĞÜŞÖÇİ]是关键。

[^\wığüşöçĞÜŞÖÇİ](türkçe)[^\wığüşöçĞÜŞÖÇİ]

可以使用,但这次它在下方找不到任何türkçe

türkçe dili destekliyorum

要解决该问题,您可以添加^$ ..

(?:^|[^\wığüşöçĞÜŞÖÇİ])(türkçe)(?:[^\wığüşöçĞÜŞÖÇİ]|$)

多数民众赞成......

  

注意:此正则表达式将匹配上一个字符和下一个字符。所以你需要再次放置它们。 (^|[^\wığüşöçĞÜŞÖÇİ])(türkçe)([^\wığüşöçĞÜŞÖÇİ]|$)   并替换为$1<span class="match">$2</span>$3

     

注意:你可以使用后面的观察并向前看但不幸的是javascript不支持后面的看法

	var word = 'İpsum';
	var rgx = new RegExp('(^|[^\wığüşöçĞÜŞÖÇİ])(' + word + ')([^\wığüşöçĞÜŞÖÇİ]|$)', 'ig');

	$('p, p *').contents().filter(function() {
	  return this.nodeType === 3;
	}).each(function() {
	  $(this).replaceWith($(this).text().replace(rgx, "$1<span class='match'>$2</span>$3"));
	});

	var positions = $('.match').map(function() {
	  return this.getBoundingClientRect().top;
	}).get();
div {
  font-size: 50px;
}
span.match {
  background: gold;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<body>
  <p>Lorem İpsum dolor sit amet, consectetur adipisicing elit. Aut voluptatum, provident saepe. Culpa animi sint, itaque iure error hic qui blanditiis perspiciatis adipisci, libero quia veritatis dignissimos quasi id cumque!</p>
</body>

  

注意:您无法使用此搜索特殊字符(例如[hi] spe.cial characters)。您必须使用this

答案 1 :(得分:1)

Javascript中的正则表达式不支持开箱即用的Unicode,这对于您使用的土耳其语字符是必需的(尽管ES6 may change this)。

此外,非ASCII字符通常不支持边界规则(例如您在表达式中使用的\b标记),因此也可能归因于此问题。如果删除边界标记,则使用RegexPal的以下示例似乎按预期工作:

enter image description here

您可能会使用XRegExp之类的插件来为处理Unicode字符添加一些支持。

更好的选择仍然可能是UnicodeJS库,它似乎添加了这个缺少的功能,可能值得尝试。