正则表达式匹配多行

时间:2013-11-21 06:11:52

标签: regex

我有以下文字

            <h4>Section 1</h4>
            <ul>
                <li><a href="http://link">link text</a></li>
                <li><a href="http://link">link text/a></li>
                <li><a href="http://link">link text</a></li>
                <li><a href="http://link">link text</a></li>
            </ul>
            <h4>Section 2</h4>
            <ul>
                <li><a href="http://link">link text</a></li>
            </ul>
            <h4>Section 3</h4>
            <ul>
                <li><a href="http://link">link text</a></li>
            </ul>

这是我到目前为止构建的正则表达式

                    <h4>(.*?)</h4>
                    <ul>
(.*?)
                    </ul>

但它只匹配“第2节”和“第3节”。如何使其与所有部分相匹配,包括“第1部分”?

1 个答案:

答案 0 :(得分:3)

这取决于您使用的语言(PHP,Perl等),但它将是这样的:

(?s)<h4>(.*?)</h4>\s*<ul>(.*?)</ul>

(?s)允许.匹配换行符(\n)。

例如,在PHP中,您可以执行以下操作:

// The regex
$regex = '#(?s)<h4>(.*?)</h4>\s*<ul>(.*?)</ul>#';
// Test data
$data = '<h4>Section 1</h4>
        <ul>
            <li><a href="http://link">link text</a></li>
            <li><a href="http://link">link text/a></li>
            <li><a href="http://link">link text</a></li>
            <li><a href="http://link">link text</a></li>
        </ul>
        <h4>Section 2</h4>
        <ul>
            <li><a href="http://link">link text</a></li>
        </ul>
        <h4>Section 3</h4>
        <ul>
            <li><a href="http://link">link text</a></li>
        </ul>';

// Get all matches
preg_match_all($regex, $data, $matches);

// Just to show the results
ob_start();
var_dump( $matches );
$show_html = ob_get_contents();
ob_end_clean();
echo "<pre>".htmlentities($show_html)."</pre>";