匹配所有不在或括号内的段落

时间:2014-12-22 15:16:49

标签: php regex

我有以下表格的文字:

<p>&nbsp;</p>

<p>Email: [client_Email]</p>

<p>Password: [client_password]</p>

<p>&nbsp;</p>

<p>[client_footer]</p>

我希望捕获所有不包含&nbsp;的段落或括号内的某些文字。所以在之前的文章中我想捕获:

<p>Email: [client_Email]</p> and <p>Password: [client_password]</p>

到目前为止,我有相反的模式:

/<p>(\[.*\]|&nbsp;)/

捕获我不想要的所有段落......

以下是代码:

$phrase = "<p>&nbsp;</p>

<p>Email: [client_Email]</p>

<p>Password: [client_password]</p>

<p>&nbsp;</p>

<p>[client_footer]</p>";
preg_match_all('/<p>(\[.*\]|&nbsp;)/', $phrase, $matches);
print_r($matches);

结果:

Array
(
    [0] => Array
        (
            [0] => <p>&nbsp;
            [1] => <p>&nbsp;
            [2] => [client_footer]
        )

    [1] => Array
        (
            [0] => <p>&nbsp;
            [1] => <p>&nbsp;
            [2] => [client_footer]
        )
)

3 个答案:

答案 0 :(得分:3)

正则表达式不是正确的工具。但如果你真的想要,这是一条路:

$phrase = "<p>&nbsp;</p>

<p>Email: [client_Email]</p>

<p>Password: [client_password]</p>

<p>&nbsp;</p>

<p>[client_footer]</p>";
preg_match_all('/<p>(?!&nbsp;)(?!\[)(.+)/', $phrase, $matches);
print_r($matches);

<强>输出:

Array
(
    [0] => Array
        (
            [0] => <p>Email: [client_Email]</p>
            [1] => <p>Password: [client_password]</p>
        )

    [1] => Array
        (
            [0] => Email: [client_Email]</p>
            [1] => Password: [client_password]</p>
        )

)

答案 1 :(得分:0)

你可以试试下面的正则表达式,

<p>(?!(?:&nbsp;|\[[^\]]*\])<\/p>).*?<\/p>

DEMO

$phrase = "<p>&nbsp;</p>

<p>Email: [client_Email]</p>

<p>Password: [client_password]</p>

<p>&nbsp;</p>

<p>[client_footer]</p>";
preg_match_all('~<p>(?!(?:&nbsp;|\[[^\]]*\])<\/p>).*?<\/p>~', $phrase, $matches);
print_r($matches);

<强>输出:

Array
(
    [0] => Array
        (
            [0] => <p>Email: [client_Email]</p>
            [1] => <p>Password: [client_password]</p>
        )

)

答案 2 :(得分:0)

我会这样做,但只有这是你想做的所有事情,并期待阅读HTML:

<p>(?:(?!\[)[^&]+?|[^&]+?(?<!\]))</p>

Regular expression visualization

Debuggex Demo

如果您打算将其扩展为阅读更多HTML,请考虑使用解析器。