2
<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 开头。

4

2 回答 2

4
preg_match('/\A.*?(?=\s*^\s*$)/smx', $subject, $regs);
$result = $regs[0];

解释

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];

假设您将只包含空格的行计算为空行。如果不是,请删除“可选空格”行。

于 2012-10-16T08:20:22.757 回答
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>

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

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

代码:(演示

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

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

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

于 2021-07-28T12:04:07.837 回答