RegEx和单词搜索不会将单词与空格匹配

时间:2015-04-12 03:26:11

标签: javascript jquery html regex highlight

我必须匹配阿拉伯语文本并使用当前脚本突出显示它们我可以突出显示或将它们包装在仅用于单个单词的链接中,如何修改此脚本以便它也可以匹配多个单词。

text = text.replace(
    /([\u0600-\u06ff]+)([^\u0600-\u06ff]+)?/g,
replacer);

完整代码

(function () {
    // Our keywords. There are lots of ways you can produce
    // this map, here I've just done it literally
    //الولايات المتحدة الأمريكية, الولايات المتحدة, اوباما, وأمريكا, والتفاوض, وإيران, الاتفاق النووي, الخليج العربي, الخليج الفارسي

    var keywords = {
        "الخليج العربي": true,
            "الاتفاق النووي": true,
            "الخليج العربي": true,
            "وإيران": true,
            "والتفاوض": true,
            "وأمريكا": true,
            "اوباما": true,
            "الولايات المتحدة": true,
            "الولايات المتحدة الأمريكية": true
    };

    // Loop through all our paragraphs (okay, so we only have two)
    $("p").each(function () {
        var $this, text;

        // We'll use jQuery on `this` more than once,
        // so grab the wrapper
        $this = $(this);

        // Get the text of the paragraph
        // Note that this strips off HTML tags, a
        // real-world solution might need to loop
        // through the text nodes rather than act
        // on the full text all at once
        text = $this.text();

        // Do the replacements
        // These character classes just use the primary
        // Arabic range of U+0600 to U+06FF, you may
        // need to add others.
        text = text.replace(
            /([\u0600-\u06ff]+)([^\u0600-\u06ff]+)?/g,
        replacer);

        // Update the paragraph
        $this.html(text);
    });

    // Our replacer. We define it separately rather than
    // inline because we use it more than once      
    function replacer(m, c0, c1) {
        // Is the word in our keywords map?
        if (keywords[c0]) {
            // Yes, wrap it
            c0 = '<a class="red" href="#">' + c0 + '</a>';
        }
        return c0 + c1;
    }
})();

小提琴示例:http://jsfiddle.net/u3k01bfw/1/

实际来源Text Matching not working for Arabic issue may be due to regex for arabic

我只想匹配关键字并将其包装在HTML <span></span><a href="#"> <a/>周围,以突出显示匹配的关键字或将其转换为链接

更新:我还使用了其他插件,例如Highlight,但也打破了阿拉伯语,因为其中一位用户推荐使用Highlight插件作为解决方案,但它会像这个问题上周提出https://stackoverflow.com/questions/29533793/highlighting-of-text-breaks-when-for-either-english-or-arabic

我还有其他问题,我采取的方法,

  1. 如果阿拉伯语单词包含在"中或由,分隔,或者有时候,如果我从正则表达式中移除\s,则最后一个单词不匹配
  2. >
  3. 到目前为止,我可能还有其他可能发生故障的情况,我试图解决一个问题,但其他事情会中断。
  4. 我很感激这方面的帮助,我只是想使用任何正常工作的插件匹配完全阿拉伯语关键字,到目前为止我尝试了一些选项,但他们有其他问题之一

1 个答案:

答案 0 :(得分:1)

你的方法的问题不在于正则表达式。您分别匹配每个,然后检查该字是否为关键字。如果keywords包含不是单词的内容,那么您将永远不会匹配它。

一种选择是将正则表达式模式更改为基于keywords

例如:

var keywords = [ "الخليج العربي","الاتفاق النووي","الخليج العربي",
                 "وإيران","والتفاوض","وأمريكا","اوباما",
                 "الولايات المتحدة الأمريكية","الولايات المتحدة"];
var keywordRegexp = new RegExp(keywords.join("|"), 'g');

然后:

text = text.replace(keywordRegexp, '<a class="red" href="#">$&</a>');

或:

function replacer(g0) {
    return '<a class="red" href="#">' + g0 + '</a>';
}
text = text.replace(keywordRegexp, replacer);

关于此的一些注释:

  • 为方便起见,我已将keywords更改为数组。
  • 如果您的keywords可能包含RegExp元字符,您可能需要escape它们。也许不是。
  • 您可能需要重新排序keywords,以便更长的单词出现。具体来说,"hello world"应该在&#34;你好&#34;。
  • 之前

工作示例: http://jsfiddle.net/u3k01bfw/5/


我还要提到jQuery Highlight Plugin,它可以解决这个问题:

$("p").highlight(keywords);

工作示例: http://jsfiddle.net/u3k01bfw/6/