2014-04-04 129 views
0

我想找到该例子的所有<H3>块:解析HTML与正则表达式

<h3>sdf</h3> 
sdfsdf 
<h3>sdf</h3> 
32 
<h2>fs</h2> 
<h3>23sd</h3> 
234 
<h1>h1</h1> 

(从H3到其他H3H2)这个规则表达式发现只有第一H3

~\<h3[^>]*\>[^>]+\<\/h3\>.+(?:\<h3|\<h2|\<h1)~is 

我使用php函数preg_ma tch_all(引自文档:)第一场比赛结束后,从上次比赛结束后继续进行搜索。

我必须在我的正则表达式中修改什么?

PS

<h3>1</h3> 
1content 
<h3>2</h3> 
2content 
<h2>h2</h2> 
<h3>3</h3> 
3content 
<h1>h1</h1> 

此内容已被解析为:

[0] => <h3>1</h3>1content 
[1] => <h3>2</h3>2content 
[2] => <h3>2</h3>3content 
+9

[不使用正则表达式解析HTML(http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained -tags/1732454#1732454) –

+0

不知道我真的不知道你的问题 – jcobhams

+0

感谢您的回答,但我用自定义结构解析了我自己的页面。 –

回答

1

与DOM文档:

$dom = new DOMDocument(); 
@$dom->loadHTML($html); 

$nodes = $dom->getElementsByTagName('body')->item(0)->childNodes; 

$flag = false; 
$results = array(); 

foreach ($nodes as $node) { 
    if ($node->nodeType == XML_ELEMENT_NODE && 
     preg_match('~^h(?:[12]|(3))$~i', $node->nodeName, $m)): 
     if ($flag) 
      $results[] = $tmp; 
     if (isset($m[1])) { 
      $tmp = $dom->saveXML($node); 
      $flag = true; 
     } else 
      $flag = false; 

    elseif ($flag): 
     $tmp .= $dom->saveXML($node); 

    endif; 
} 

echo htmlspecialchars(print_r($results, true)); 

用正则表达式:

preg_match_all('~<h3.*?(?=<h[123])~si', $html, $matches); 

echo htmlspecialchars(print_r($matches[0], true)); 
1

你不应该使用正则表达式解析HTML,如果有任何嵌套参与。

的Regex

(<(h\d)>.*?<\/\2>)[\r\n]([^\r\n<]+) 

代用

\1\3 
or 
$1$3 

http://regex101.com/r/uQ3uC2

+0

您已经快速阅读了这个问题。 –

0
preg_match_all('/<h3>(.*?)<\/h3>/is', $stringHTML, $matches);