使用PHP和preg_match_all我试图获取以下标记之间的所有HTML内容(以及标记):
<p>paragraph text</p>
don't take this
<ul><li>item 1</li><li>item 2</li></ul>
don't take this
<table><tr><td>table content</td></tr></table>
Run Code Online (Sandbox Code Playgroud)
我可以得到其中一个就好了:
preg_match_all("(<p>(.*)</p>)siU", $content, $matches, PREG_SET_ORDER);
Run Code Online (Sandbox Code Playgroud)
有没有办法让所有的
<p></p> <ul></ul> <table></table>
Run Code Online (Sandbox Code Playgroud)
内容只有一个preg_match_all?我需要它们按照它们被发现的顺序出来,所以我可以回应内容,这将是有意义的.
所以,如果我在上面的内容上做了一个preg_match_all,那么迭代通过$ matches数组就会回显:
<p>paragraph text</p>
<ul><li>item 1</li><li>item 2</li></ul>
<table><tr><td>table content</td></tr></table>
Run Code Online (Sandbox Code Playgroud)
mar*_*cog 10
使用|匹配一组字符串中的一种:p|ul|table
使用反向引用来匹配approriate结束标记:\\2因为该组(pl|ul|table)包含第二个左括号
把它们放在一起:
preg_match_all("(<(p|ul|table)>(.*)</\\2>)siU", $content, $matches, PREG_SET_ORDER);
Run Code Online (Sandbox Code Playgroud)
如果您的输入html遵循非常严格的结构,这只会起作用.它不能在标记中包含空格,也不能在标记中包含任何属性.当有任何嵌套时它也会失败.考虑使用html解析器来做正确的工作.