如何删除两个单词之间的字符串

Posted

技术标签:

【中文标题】如何删除两个单词之间的字符串【英文标题】:How to remove string between two words 【发布时间】:2013-12-26 03:36:27 【问题描述】:

我正在使用以下代码行下载网页,

WebRequest request = WebRequest.Create(strURL);
WebResponse response = request.GetResponse();
Stream data = response.GetResponseStream();

string html = String.Empty;
using (StreamReader sr = new StreamReader(data))

  html = sr.ReadToEnd();

然后我从这里提取身体部位如下:

int nBodyStart = downloadString.IndexOf("<body");
int nBodyEnd = downloadString.LastIndexOf("</body>");
String strBody = downloadString.Substring(nBodyStart, (nBodyEnd - nBodyStart + 7));

现在我想删除正文部分的所有 javascript,我该怎么做?

我的目标是获取网页的唯一内容。但由于每个页面可能有不同的方法,所以我试图删除任何 js 标签,然后使用下面的 RegEx 删除任何 HTML 标签

Regex.Replace(strBody, @"<[^>]+>|&nbsp;", "").Trim();

但是我不知道怎么去掉script标签之间的js,因为脚本可能是多行也可能是单行。

提前致谢。

【问题讨论】:

任何时候出现 html 的正则表达式解析......这篇文章总是值得一读***.com/questions/1732348/… @GrantWinney 我尝试使用它。但即使我的 URL 有 242 个字符,它也会抛出以下异常:指定的路径、文件名或两者都太长。完全限定文件名必须少于 260 个字符,目录名必须少于 248 个字符。 【参考方案1】:

要匹配脚本标签(包括对的内部),请使用以下内容:

&lt;script[^&gt;]*&gt;(.*?)&lt;/script&gt;

要匹配所有 HTML 标记(但不匹配对的内部),您可以使用:

&lt;/?[a-z][a-z0-9]*[^&lt;&gt;]*&gt;


我刚刚意识到您可能还想删除样式标签:

&lt;style[^&gt;]*&gt;(.*?)&lt;/style&gt;


这里是完整的正则表达式字符串:

&lt;script[^&gt;]*&gt;(.*?)&lt;/script&gt;|&lt;style[^&gt;]*&gt;(.*?)&lt;/style&gt;|&lt;/?[a-z][a-z0-9]*[^&lt;&gt;]*&gt;|&lt;[^&gt;]+&gt;|&amp;nbsp;

【讨论】:

您提供的正则表达式仅从单行中删除标签。如果脚本标签的开始和结束在不同的行怎么办?我也想删除它们之间的内容。 如果您使用 javascript 进行匹配,您可能必须使用任何“点”匹配项指定 [\r\n]。如果您使用的是 C#,它可能是相同的,或者您可以指定点与正则表达式开头的 (?s) 的换行符匹配。 你让我更接近了。但它没有删除脚本标签之间的内容。我也没有脚本标签之间的内容。我正在用 C# 编码。 我不是 100% 确定如何在 C# 中执行此操作,但我感觉默认情况下点与换行符不匹配。在正则表达式中,您可以像这样使用(?s) 指定模式:(?s)(?:&lt;(?:script|style)[^&gt;]*&gt;(.*?)&lt;/(?:script|style)&gt;|&lt;/?[a-z][a-z0-9]*[^&lt;&gt;]*&gt;),但如果 C# 的某些部分覆盖它,它将不起作用。例如,如果执行匹配的函数本身只能读取单行,则必须使用不同的函数。 感谢所有帮助。我最终使用了您的旧 reg ex,几乎没有修改。所以最终的正则表达式如下 '||?[az ][a-z0-9]*[^]*>|]+>| '【参考方案2】:

你可以使用HtmlAgilityPack

WebRequest request = WebRequest.Create(strURL);
WebResponse response = request.GetResponse();
Stream data = response.GetResponseStream();

string html = String.Empty;
using (StreamReader sr = new StreamReader(data))

  html = sr.ReadToEnd();


HtmlAgilityPack.HtmlDocument document = new HtmlAgilityPack.HtmlDocument();
document.LoadHtml(html);

// to remove all tags 
var result = document.DocumentNode.InnerText;

// to remove script tags inside body 
document.DocumentNode.SelectSingleNode("//body").Descendants()
                .Where(n => n.Name == "script")
                .ToList()
                .ForEach(n => n.Remove());

【讨论】:

他也想删除所有标签(如&lt;whatever&gt;),只保留文本。至少我是这么理解的。 我试过用那个。但即使我的 URL 有 242 个字符,它也会抛出以下异常:指定的路径、文件名或两者都太长。完全限定文件名必须少于 260 个字符,目录名必须少于 248 个字符。 @juan.facorro 你是对的。我想删除所有标签。我只想保留正文的主要数据/内容。不是 js 函数、图像或除内容之外的任何其他东西。 @PratikGaikwad 您已经下载了 html 作为字符串,您可以使用该字符串,如果您想删除所有标签,请使用 document.DocumentNode.InnerText @Damith:我也试过了,再次遇到异常:mscorlib.dll 中出现“System.ArgumentException”类型的未处理异常附加信息:路径中的非法字符。

以上是关于如何删除两个单词之间的字符串的主要内容,如果未能解决你的问题,请参考以下文章

删除字符串中的一个单词(或两个空格之间)

删除字符和单词之间的空格[重复]

使用 sed 删除两个单词之间的数据

如何从随机字符串中删除单词“ BALLOON”?

c ++如何提取单词之间的空格(如果有的话)

仅用连字符替换单词之间的空格并删除所有其他空格[重复]