在HTML标签之间提取波斯和英语字符

时间:2018-10-26 09:36:59

标签: c# html regex tags

有人会帮助我为此HTML标签制作regx吗?

<h1 class="c-product__title">
    هندزفری بلوتوث مدل HBQ-I7
                <span>HBQ-I7 Bluetooth Handsfree</span></h1>

我要提取“ HBQ-I7” “ HBQ-I7蓝牙免提”
谢谢

3 个答案:

答案 0 :(得分:1)

var source = @"<h1 class=""c-product__title"">هندزفری بلوتوث مدل HBQ-I7<span>HBQ-I7 Bluetooth Handsfree</span></h1>";
var regex = new Regex(@"product__title"">(?<farci>.+)<span>(?<english>.+)</span>");
var match = regex.Match(source);

这将返回3个组,第一个组与整个正则表达式匹配,然后再返回2个组,一个组与波斯人称为farci,第二个组与英语版本称为English。

仅当它们都在同一行时才有效。如果您有换行符,那就行不通了。

如果您可以更轻松地将html视为xml并将Linq用作,则换行符不是问题。

答案 1 :(得分:0)

使用正则表达式

string html = @"<h1 class=""c-product__title"">
    هندزفری بلوتوث مدل HBQ-I7
                <span>HBQ-I7 Bluetooth Handsfree</span></h1>";

string h1Start = @"<h1.*?>"; // h1 tag, with or without attributes
string spanStart = @"<span.*?>"; // span tag, with or without attributes
string spanEnd = @"</span>"; // span closing tag
string text = @"\s*(.+)\s*"; // there MIGHT be whitespace before and/or after the text
var regex = new Regex($"{h1Start}{text}{spanStart}{text}{spanEnd}");

Match match = regex.Match(html);

if (match.Success)
{
    string persianText = match.Groups[1].Value.Trim();
    string englishText = match.Groups[2].Value.Trim();
}

替代解决方案-使用HtmlAgilityPack

在这种特殊情况下,为了解析HTML片段,HtmlAgilityPack比正则表达式更好。

示例:

using System;
using System.Linq;
using HtmlAgilityPack;

namespace HtmlAgilityPackDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            string html = @"<h1 class=""c-product__title"">
    هندزفری بلوتوث مدل HBQ-I7
                <span>HBQ-I7 Bluetooth Handsfree</span></h1>";

            HtmlDocument doc = new HtmlDocument();
            doc.LoadHtml(html);

            var text = (from node in doc.DocumentNode.ChildNodes
                let textNode = node.SelectSingleNode("//text()") // selects the text 
                let spanNode = node.SelectSingleNode("span")
                select new 
                {
                    PersianText = textNode.InnerText.Trim(),
                    EnglishText = spanNode.InnerText.Trim()
                })
                .FirstOrDefault();

            Console.Read();
        }
    }
}

答案 2 :(得分:0)

如果在C#代码中将HTMLTag作为字符串获取,则可以尝试使用.split()方法提取所需的/所需的部分。例如:

String htmlTag = " < h1 class=\"c-product__title\">    هندزفری بلوتوث مدل HBQ-I7                <span> HBQ-I7 Bluetooth Handsfree</span></h1>";
string[] htmlTagSplitted = htmlTag.Split('<');
string[] htmlTagSplitted2 = new string[20];
string[] htmlTagSplitted3 = new string[20];          
htmlTagSplitted2 = htmlTagSplitted[1].Split('>');
htmlTagSplitted3 = htmlTagSplitted[2].Split('>');

Console.WriteLine(htmlTagSplitted2[1] + htmlTagSplitted3[1]);

htmlTagSplitted2 [1]包含所需字符串的第一部分,而htmlTagSplitted3 [1]包含第二部分。我知道这不是Regex,也不是漂亮的语法,但是它确实可以做到:-D

最好的问候尼科!