PHP preg_match任何内容,直到第一个空白行

时间:2012-10-16 08:18:24

标签: php regex preg-match

<ul>
    <li><a href="#">Foo</a></li>
    <li><a href="#">Foo</a></li>
    <li><a href="#">Foo</a></li>
</ul>

<ul>
    <li><a href="#">Bar</a></li>
    <li><a href="#">Bar</a></li>
    <li><a href="#">Bar</a></li>
</ul>

如何在第一个空白行之前获取任何内容?

注意:内容的第一部分和第二部分并不总是以ul开头。

2 个答案:

答案 0 :(得分:4)

preg_match(
    '/\A    # Start of string
    .*?     # Match any number of characters (as few as possible)
    (?=     # until it is possible to match...
     \s*    #  trailing whitespace, including a linebreak 
     ^      #  Start of line
     \s*    #  optional whitespace
     $      #  End of line
    )       # (End of lookahead assertion)/smx', 
    $subject, $regs);
$result = $regs[0];

假设您将除空格之外的任何行都计为空行。如果没有,请删除“可选空格”行。

答案 1 :(得分:0)

在如下所示的示例字符串中:

<ul>
    <li><a href="#">Foo</a></li>
    <li><a href="#">Foo</a></li>
    <li><a href="#">Foo</a></li>
</ul>

<ul>
    <li><a href="#">Bar</a></li>
    <li><a href="#">Bar</a></li>
    <li><a href="#">Bar</a></li>
</ul>

<ul>
    <li><a href="#">Bum</a></li>
    <li><a href="#">Bum</a></li>
    <li><a href="#">Bum</a></li>
</ul>

<ul>
    <li><a href="#">Barf</a></li>
    <li><a href="#">Barf</a></li>
    <li><a href="#">Barf</a></li>
</ul>

Tim 的 preg_match() 模式使用惰性量词和前瞻需要 432 步才能完成。它还依赖于字符串中实际存在双换行符序列的事实(如果双换行符不存在则匹配失败)。

我想我会推荐一种不同的技术。使用更简单(贪婪)的模式在字符串上使用 preg_replace()

代码:(Demo)

preg_replace('/\R{2}.*/s', '', $html)

它不仅返回所需的输出,无论字符串中是否出现双换行符序列,该模式只需 7 个步骤。这就是我将在我的项目中使用的内容。

\R 匹配不同操作系统上的换行符序列。
s s 模式修饰符告诉正则表达式引擎在与通配符 . 匹配时包含换行符。