在没有关于解析(X)HTML或XML并且询问正则表达式的问题的情况下,SO上没有任何日子.
虽然相对容易想出用于演示此任务的正则表达式的不可行性的示例或用表达概念的表达式集合,我仍然无法在SO上找到为什么在外行人中无法做到这一点的正式解释条款.
到目前为止我在这个网站上找到的唯一正式解释可能非常准确,但对于自学成才的程序员来说也很神秘:
这里的缺陷是HTML是Chomsky Type 2语法(无上下文语法)而RegEx是Chomsky Type 3语法(正则表达式)
要么:
正则表达式只能匹配常规语言,但HTML是无上下文的语言.
要么:
有限自动机(它是正则表达式下面的数据结构)除了它所处的状态之外没有内存,如果你有任意深度的嵌套,你需要一个任意大的自动机,它与有限自动机的概念相冲突.
要么:
常规语言的Pumping引理是你不能这样做的原因.
[公平地说:以上大多数解释链接到维基百科页面,但这些并不比答案本身更容易理解].
所以我的问题是:有人可以提供一个外行人的上述正式解释的翻译,为什么不可能使用正则表达式来解析(X)HTML/XML?
编辑:在读完第一个答案之后,我认为我应该澄清:我正在寻找一个"翻译",它也简要地解释了它试图翻译的概念:在答案的最后,读者应该有一个粗略的想法 - 例如 - "常规语言"和"无语境语法"是什么意思......
我正在开始一个使用asp.net mvc公开面对的项目.我知道那里有大约十亿个php,python和ruby html清洁剂,但有没有人对.net中的任何好东西都有一些指示?你对那里的经历有什么经验?我知道stackoverflow是一个在asp.net中完成的站点,允许自由格式HTML,它使用什么?
有没有人有这个变种?
这是我可以采取一些HTML并显示它而不打破作为文章的摘要引导?
让我免于重新发明轮子!
对不起,新来的,你的权利,应该更好地表达这个问题,还有更多的信息
我希望获取一个html字符串并将其截断为一定数量的单词(甚至是char长度),这样我就可以将它的开头显示为摘要(然后导致主要文章).我希望保留html,以便我可以在预览中显示链接等.
我必须解决的主要问题是,如果我们在一个或多个标签的中间截断,我们最终可能会得到未封闭的html标签!
我有解决方案的想法是
首先将html截断为N个单词(单词更好但chars ok)(确保不要停留在标记的中间并截断require属性)
通过这个截断的字符串中打开的html标签工作(也许我会把它们粘在堆栈上?)
然后处理结束标记并确保它们与我在弹出它们时的堆栈匹配?
如果在此之后有任何打开的标签留在堆栈上,那么将它们写入截断的字符串的末尾,html应该是好的去!
感谢所有评论:)
using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using System.Xml;
using System.Xml.XPath;
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace PINET40TestProject
{
[TestClass]
public class UtilityUnitTest
{
public static string TruncateHTMLSafeishChar(string text, int charCount)
{
bool inTag = false;
int cntr = 0;
int cntrContent = 0;
// loop through html, counting only viewable content
foreach (Char c in text)
{
if (cntrContent …Run Code Online (Sandbox Code Playgroud) 用户可以输入稍后将显示给其他用户的HTML.我正在使用的WYSIWYG插件从前端清理HTML.它删除了所有潜在的恶意标签(脚本,src,以"on"等开头的任何东西)我显然也需要在后端进行一些验证.
有谁知道C#的好解决方案?我一直看到这个http://roberto.open-lab.com/2010/03/04/a-html-sanitizer-for-c/,虽然我有点犹豫是否使用随机博客中的一些代码.有没有众所周知的插件?大多数人在这种情况下做了什么?