正则表达式匹配开放标记,但XHTML自包含标记除外

正则表达式匹配开放标记,但XHTML自包含标记除外,html,regex,xhtml,Html,Regex,Xhtml,我需要匹配所有这些开头标记: <p> <a href="foo"> 我相信上面说: 那么找一个不到 找到(并捕获)a-z一次或多次,然后 找到零个或多个空格,然后 查找任何字符零次或多次,贪婪,除了/,然后 找到一个大于 我有这个权利吗?更重要的是,您认为呢?您希望第一个前面不要有/。寻找如何做到这一点的细节。这被称为“消极落后” 然而,在本示例文档中,它的一个幼稚实现最终将匹配 <foo><bar/></foo> 你能提供

我需要匹配所有这些开头标记:

<p>
<a href="foo">
我相信上面说:

  • 那么找一个不到
  • 找到(并捕获)a-z一次或多次,然后
  • 找到零个或多个空格,然后
  • 查找任何字符零次或多次,贪婪,除了
    /
    ,然后
  • 找到一个大于

我有这个权利吗?更重要的是,您认为呢?

您希望第一个
前面不要有
/
。寻找如何做到这一点的细节。这被称为“消极落后”

然而,在本示例文档中,它的一个幼稚实现最终将匹配

<foo><bar/></foo>

你能提供一些关于你试图解决的问题的更多信息吗?您是否以编程方式迭代标记?

尝试:

<([^\s]+)(\s[^>]*?)?(?<!/)>
]*?)?(?

它与您的类似,但最后一个
不能在斜杠之后,并且也接受
h1

您无法解析[X]带有正则表达式的HTML。因为正则表达式无法解析HTML。正则表达式不是一个可以用来正确解析HTML的工具。正如我以前在HTML和正则表达式中多次回答的问题,正则表达式的使用将不允许您使用HTML。正则表达式是一个不够复杂的工具,无法理解employe的结构HTML不是一种常规语言,因此无法通过正则表达式进行解析。正则表达式查询无法将HTML分解为有意义的部分。很多次,我都无法理解它。即使是Perl使用的增强型不规则正则表达式也无法完成解析HTML的任务。你永远不会让我破解。HTML i这是一种非常复杂的语言,无法用正则表达式解析。即使是Jon Skeet也无法用正则表达式解析HTML。每当你试图用正则表达式解析HTML时,邪恶的孩子会为处女流下鲜血,俄罗斯黑客会攻击你的Web应用程序。用正则表达式解析HTML会将受污染的灵魂召唤到re生活的施舍。HTML和regex就像爱情、婚姻和杀婴仪式一样走在一起。现在已经太迟了。regex和HTML在同一个概念空间的力量会像许多水油灰一样摧毁你的思想。如果你用regex解析HTML,你就是在向他们屈服,他们亵渎神明的方式注定了我们所有人的命运对于一个名字不能在基本的多语言平面上表达的人,他来了​当你观察时,你的心灵在恐怖的冲击中枯萎。基于Rege的HTML解析器是杀死StackOverflow的癌症,为时已晚为时已晚我们无法挽救chi͡ld的越轨确保regex将消耗所有的活组织(除了HTML,它不能,正如之前预言的那样)亲爱的上帝,帮助我们,任何人如何能在这场灾难中幸存下来使用正则表达式解析HTML已经注定了人类将永远陷入可怕的折磨和安全漏洞使用正则表达式作为处理HTML的工具在这个世界和腐败实体的可怕领域之间建立了一个缺口(与SGML实体一样,但更腐败)仅仅是对reg世界的一瞥​用于HTML的ex解析器将在​tantly将一个程序员的意识带入一个不断尖叫的世界,他来了,瘟疫般的slithy regex感染将​我吞噬你的灵魂​ML解析器、应用程序和存在一直像VisualBasic一样,只不过更糟糕的是他来了,他来了,他不来​是的,他是,我是​s unͤhoͤly radiańcédestro͝ying all enlḯm̈́͠e,HTML标记lea͠ki̧n͘g fr̶ǫm̦yo​你的眼睛是液体​uid pain,这是一首古老的歌曲​这将是exti​nguish mor的声音​来自sp的tal man​在这里我能看到它。你能看到吗?我很漂亮​他最后对谎言嗤之以鼻​人的一切都是我的​他丢了乒乓球——是的,他来了,是的,他来了​或者渗透我的脸我的脸ᵒ上帝啊,不,不,不​别再这样了​*̶͑̾̾​第二部分:规范​在本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本本月,本月,本月,本月,本月,本本本月,本月,本本月,本本月,794​本校的一个月月内,本校的一个月月内的一个月内,该校的一个月内的一个月内的一个月内的一个月内的一个月内的一个月内的一个月内的一个月内的一个月内的本本本本本本本校的本本本本本校的本本本本本本月月月内的本本本本月月月月月的本本本本本本月月月月月的本本本本本本本月月月月月月月的本本本本本本月月月月的本本本本本月月月的本本本本月月月月月月月月的本本本本本本月月月的8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8日日日日日日,本本本本本本本本本本本本本本本本本月月月月月月月月月月的本本本本本本本本本本̝


您尝试过使用XML解析器吗


主持人备注

此帖子已锁定,以防止对其内容进行不适当的编辑。帖子的外观与预期的外观完全相同-其内容没有问题。请不要将其标记以引起我们的注意

我建议在PHP中使用解析XML和HTML。它的语法基本上与jQuery相同,只是在服务器端。

虽然不可能只使用正则表达式解析任意HTML,但有时使用它们解析有限的已知HTML集是合适的

如果你有一小部分HTML页面,你想从中提取数据,然后塞进数据库,正则表达式可能可以很好地工作。例如,我最近想获取澳大利亚联邦代表的姓名、政党和地区,我从议会网站上获得了这些信息。这是一项有限的一次性工作


正则表达式对我来说工作得很好,设置起来非常快。

W3C以伪正则表达式的形式解释解析:

按照
QName
S
Attribute
的var链接,以获得更清晰的图片。

基于此,您可以创建一个非常好的regexp来处理剥离标记之类的事情。

免责声明:如果您有选择,请使用解析器。也就是说

这是我用来匹配HTML标记的正则表达式(!):

<(?:"[^"]*"['"]*|'[^']*'['"]*|[^'">])+>
])+>
它可能并不完美
<([^\s]+)(\s[^>]*?)?(?<!/)>
<(?:"[^"]*"['"]*|'[^']*'['"]*|[^'">])+>
<(?:"[^"]*"['"]*|'[^']*'['"]*|[^'">])+(?<!/\s*)>
<?php
$selfClosing = explode(',', 'area,base,basefont,br,col,frame,hr,img,input,isindex,link,meta,param,embed');

$html = '
<p><a href="#">foo</a></p>
<hr/>
<br/>
<div>name</div>';

$dom = new DOMDocument();
$dom->loadHTML($html);
$els = $dom->getElementsByTagName('*');
foreach ( $els as $el ) {
    $nodeName = strtolower($el->nodeName);
    if ( !in_array( $nodeName, $selfClosing ) ) {
        var_dump( $nodeName );
    }
}
string(4) "html"
string(4) "body"
string(1) "p"
string(1) "a"
string(3) "div"
<([a-zA-Z][a-zA-Z0-9]*)[^>]*(?<!/)>
//p/a[@href='foo']
<([a-z]+) *[^/]*?>
<([a-z]+)[^>]*(?<!/)>
$store =~ s/http:/http:\/\//gi;
$store =~ s/https:/https:\/\//gi;
$baseurl = $store;

if (!$query->param("ascii")) {
    $html =~ s/\s\s+/\n/gi;
    $html =~ s/<pre(.*?)>(.*?)<\/pre>/\[code]$2\[\/code]/sgmi;
}

$html =~ s/\n//gi;
$html =~ s/\r\r//gi;
$html =~ s/$baseurl//gi;
$html =~ s/<h[1-7](.*?)>(.*?)<\/h[1-7]>/\n\[b]$2\[\/b]\n/sgmi;
$html =~ s/<p>/\n\n/gi;
$html =~ s/<br(.*?)>/\n/gi;
$html =~ s/<textarea(.*?)>(.*?)<\/textarea>/\[code]$2\[\/code]/sgmi;
$html =~ s/<b>(.*?)<\/b>/\[b]$1\[\/b]/gi;
$html =~ s/<i>(.*?)<\/i>/\[i]$1\[\/i]/gi;
$html =~ s/<u>(.*?)<\/u>/\[u]$1\[\/u]/gi;
$html =~ s/<em>(.*?)<\/em>/\[i]$1\[\/i]/gi;
$html =~ s/<strong>(.*?)<\/strong>/\[b]$1\[\/b]/gi;
$html =~ s/<cite>(.*?)<\/cite>/\[i]$1\[\/i]/gi;
$html =~ s/<font color="(.*?)">(.*?)<\/font>/\[color=$1]$2\[\/color]/sgmi;
$html =~ s/<font color=(.*?)>(.*?)<\/font>/\[color=$1]$2\[\/color]/sgmi;
$html =~ s/<link(.*?)>//gi;
$html =~ s/<li(.*?)>(.*?)<\/li>/\[\*]$2/gi;
$html =~ s/<ul(.*?)>/\[list]/gi;
$html =~ s/<\/ul>/\[\/list]/gi;
$html =~ s/<div>/\n/gi;
$html =~ s/<\/div>/\n/gi;
$html =~ s/<td(.*?)>/ /gi;
$html =~ s/<tr(.*?)>/\n/gi;

$html =~ s/<img(.*?)src="(.*?)"(.*?)>/\[img]$baseurl\/$2\[\/img]/gi;
$html =~ s/<a(.*?)href="(.*?)"(.*?)>(.*?)<\/a>/\[url=$baseurl\/$2]$4\[\/url]/gi;
$html =~ s/\[url=$baseurl\/http:\/\/(.*?)](.*?)\[\/url]/\[url=http:\/\/$1]$2\[\/url]/gi;
$html =~ s/\[img]$baseurl\/http:\/\/(.*?)\[\/img]/\[img]http:\/\/$1\[\/img]/gi;

$html =~ s/<head>(.*?)<\/head>//sgmi;
$html =~ s/<object>(.*?)<\/object>//sgmi;
$html =~ s/<script(.*?)>(.*?)<\/script>//sgmi;
$html =~ s/<style(.*?)>(.*?)<\/style>//sgmi;
$html =~ s/<title>(.*?)<\/title>//sgmi;
$html =~ s/<!--(.*?)-->/\n/sgmi;

$html =~ s/\/\//\//gi;
$html =~ s/http:\//http:\/\//gi;
$html =~ s/https:\//https:\/\//gi;

$html =~ s/<(?:[^>'"]*|(['"]).*?\1)*>//gsi;
$html =~ s/\r\r//gi;
$html =~ s/\[img]\//\[img]/gi;
$html =~ s/\[url=\//\[url=/gi;
$pattern = "/<([\w]+)([^>]*?)(([\s]*\/>)|(>((([^<]*?|<\!\-\-.*?\-\->)|(?R))*)<\/\\1[\s]*>))/s";
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
+r/vD34mUADO1P4/AQAA//8=
$_ = join "",<STDIN>; tr/\n\r \t/ /s; s/</\n</g; s/>/>\n/g; s/\n ?\n/\n/g;
s/^ ?\n//s; s/ $//s; print
/(<.*?>|[^<]+)\s*/g    # Get tags and text
/(\w+)="(.*?)"/g       # Get attibutes
<?php
// here's the pattern:
$pattern = '/<(\w+)(\s+(\w+)\s*\=\s*(\'|")(.*?)\\4\s*)*\s*(\/>|>)/';

// a string to parse:
$string = 'Hello, try clicking <a href="#paragraph">here</a>
    <br/>and check out.<hr />
    <h2>title</h2>
    <a name ="paragraph" rel= "I\'m an anchor"></a>
    Fine, <span title=\'highlight the "punch"\'>thanks<span>.
    <div class = "clear"></div>
    <br>';

// let's get the occurrences:
preg_match_all($pattern, $string, $matches, PREG_PATTERN_ORDER);

// print the result:
print_r($matches[0]);
?>
$pattern = '/<(\w+)(\s+(\w+)\s*\=\s*(\'|")(.*?)\\4\s*)*\s*>/';
$pattern = '/<(\w+)(\s+(\w+)(\s*\=\s*(\'|"|)(.*?)\\5\s*)?)*\s*>/';
<html>
<body>
<div>
   <br />
   <ul id="matchMe" type="square">
      <li>stuff...</li>
      <li>more stuff</li>
      <li>
          <div>
               <span>still more</span>
               <ul>
                    <li>Another &gt;ul&lt;, oh my!</li>
                    <li>...</li>
               </ul>
          </div>
      </li>
   </ul>
</div>
</body>
</html>
   <ul id="matchMe" type="square">
      <li>stuff...</li>
      <li>more stuff</li>
      <li>
          <div>
               <span>still more</span>
               <ul>
                    <li>Another &gt;ul&lt;, oh my!</li>
                    <li>...</li>
               </ul>
          </div>
      </li>
   </ul>
<ul id="matchMe" type="square">           <li>stuff...</li>           <li>more stuff</li>           <li>               <div>                    <span>still more</span>                    <ul>                         <li>Another &gt;ul&lt;, oh my!</li>                         <li>...</li>                    </ul>               </div>           </li>        </ul>
<\s*(\w+)[^/>]*>
HTML has
complexity exceeding
regular language.
The regex you seek
is defined within the phrase
<([a-zA-Z]+)(?:[^>]*[^/]*)?>
</?([A-Za-z][^\s>/]*)(?:=\s*(?:"[^"]*"|'[^']*'|[^\s>]+)|[^>])*(?:>|$)
<(?:([_:A-Z][-.:\w]*)(?:\s+[_:A-Z][-.:\w]*\s*=\s*(?:"[^"]*"|'[^']*'))*\s*/?|/([_:A-Z][-.:\w]*)\s*)>
/<[^/]*?>/g