Преобразование арабских цифр в арабские/персидские цифры в html-файле

Я пытаюсь преобразовать простые текстовые арабские цифры в восточно-арабские цифры. Таким образом, в основном берется 1 2 3... и преобразуется в ١‎ ٢‎ ٣‎.... Функция преобразует все числа, включая любые числа, содержащиеся в тегах, например H1.

 private void LoadHtmlFile(object sender, EventArgs e)
        {
            var htmlfile = "<html><body><h1>i was born in 1988</h1></body></html>".ToArabicNumber(); ;
            webBrowser1.DocumentText=htmlfile;
        }


    }
    public static class StringHelper
    {
        public static string ToArabicNumber(this string str)
        {
            if (string.IsNullOrEmpty(str)) return "";
            char[] chars;
            chars = str.ToCharArray();
            for (int i = 0; i < str.Length; i++)
            {
                if (str[i] >= '0' && str[i] <= '9')
                {
                    chars[i] += (char)1728;
                }
            }
            return new string(chars);
        }
    }

Я также пробовал ориентироваться только на числа в InnerText, но это тоже не сработало. В приведенном ниже коде также изменяются номера тегов.

private void LoadHtmlFile(object sender, EventArgs e)
        {
            var htmlfile = "<html><body><h1>i was born in 1988</h1></body></html>" ;
            webBrowser1.DocumentText=htmlfile;
        }

        private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            webBrowser1.Document.Body.InnerText = webBrowser1.Document.Body.InnerText.ToArabicNumber();
        }

Какие-либо предложения?


person KF2    schedule 14.02.2013    source источник
comment
Рассматривали ли вы HtmlAgilityPack для работы с HTML?   -  person Alexei Levenkov    schedule 14.02.2013


Ответы (4)


Вы можете использовать регулярное выражение, чтобы найти части HTML, которые находятся между символами «›» и «‹», и работать с ними. Это предотвратит обработку кодом имен тегов и атрибутов (стиль и т. д.).

// Convert all English digits in a string to Arabic digit equivalents
public static string ToArabicNums(string src)
{
    const string digits = "۰۱۲۳۴۵۶۷۸۹";
    return string.Join("", 
        src.Select(c => c >= '0' && c <= '9' ? digits[((int)c - (int)'0')] : c)
    );
}

// Convert all English digits in the text segments of an HTML 
// document to Arabic digit equivalents
public static string ToArabicNumsHtml(string src)
{
    string res = src;

    Regex re = new Regex(@">(.*?)<");

    // get Regex matches 
    MatchCollection matches = re.Matches(res);

    // process in reverse in case transformation function returns 
    // a string of a different length
    for (int i = matches.Count - 1; i >= 0; --i)
    {
        Match nxt = matches[i];
        if (nxt.Groups.Count == 2 && nxt.Groups[1].Length > 0)
        {
            Group g = nxt.Groups[1];
            res = res.Substring(0, g.Index) + ToArabicNums(g.Value) +
                res.Substring(g.Index + g.Length);
    }

    return res;
}

Это не идеально, так как он вообще не проверяет спецификаторы символов HTML за пределами тегов, такие как конструкция &#<digits>; (&#1777; для ۱ и т. д.), чтобы указать символ по значению Unicode, и заменит цифры в этих тегах. . Он также не будет обрабатывать лишний текст перед первым тегом или после последнего тега.

Образец:

Calling: ToArabicNumsHtml("<html><body><h1>I was born in 1988</h1></body></html>")
Result: "<html><body><h1>I was born in ۱۹۸۸</h1></body></html>"

Используйте любой код, который вы предпочитаете в ToArabicNums, чтобы выполнить фактическое преобразование, или обобщите его, передав функцию преобразования.

person Corey    schedule 14.02.2013

Используйте регулярные выражения. Вот код JavaScript, который я сам использую:

function toIndic(n) {
    var ns = ['۰', '۱', '۲', '۳', '۴', '۵', '۶', '۷', '۸', '۹'];

    return n.toString().replace(/\d/g, function (m) { 
        return ns[m];
    });
}

Чтобы убедиться, что вы конвертируете только числа, вы можете использовать лучшее регулярное выражение: \b[0-9]+\b

person alijsh    schedule 14.02.2013
comment
Это также изменение 1 в теге H1 - person KF2; 14.02.2013
comment
Разбор HTML с помощью регулярных выражений является полуприемлемым, если вы знаете точную структуру HTML и вам нужно выбрать очень ограниченные, четко определенные элементы. похоже, что @irsog хочет общий код - регулярное выражение - плохая идея для этого - stackoverflow.com/questions/1732348/ - person Alexei Levenkov; 14.02.2013

Эта функция может конвертировать английский язык в персидский, арабский и ordu.

function convertDigitIn(enDigit){ // PERSIAN, ARABIC, URDO
    var newValue="";
    for (var i=0;i<enDigit.length;i++)
    {
        var ch=enDigit.charCodeAt(i);
        if (ch>=48 && ch<=57
        {
            // european digit range
            var newChar=ch+1584;
            newValue=newValue+String.fromCharCode(newChar);
        }
        else
            newValue=newValue+String.fromCharCode(ch);
    }
    return newValue;
}
person Community    schedule 14.02.2013
comment
+0: ​​у вас правильная функция, но, к сожалению, если вы читаете вопрос, как найти все текстовые значения в HTML и применить известное преобразование, это не имеет ничего общего с заголовком... - person Alexei Levenkov; 14.02.2013

Просто добавьте это в конец вашего документа, все будет нормально :-)

<script type="text/javascript">
    $(document).ready(function() {
        var map = ["&\#1632;","&\#1633;","&\#1634;","&\#1635;","&\#1636;","&\#1637;","&\#1638;","&\#1639;","&\#1640;","&\#1641;"]

        document.body.innerHTML = document.body.innerHTML.replace(
            /\d(?=[^<>]*(<|$))/g,
            function($0) { return map[$0] }
        );
    });
</script>
person Bashir Noori    schedule 05.03.2017