Php 是否可以在preg_match中排除匹配字符串的部分?

Php 是否可以在preg_match中排除匹配字符串的部分?,php,regex,Php,Regex,当编写一个脚本从一个特定的div下载内容时,我想知道是否可以跳过模式的某些部分,这样它就不会包含在匹配结果中 例如: <?php $html = ' <div class="items"> <div class="item-s-1827"> content 1 </div> <div class="item-s-1827"> content 2 </div> <

当编写一个脚本从一个特定的div下载内容时,我想知道是否可以跳过模式的某些部分,这样它就不会包含在匹配结果中

例如:

<?php

$html = '
<div class="items">
    <div class="item-s-1827">
      content 1
    </div>
    <div class="item-s-1827">
      content 2
    </div>
    <div class="item-s-1827">
      content 3
    </div>
</div>
';

preg_match_all('/<div class=\"item-s-([0-9]*?)\">([^`]*?)<\/div>/', $html, $match);
print_r($match);

/*

Array
(
    [0] => Array
        (
            [0] => <div class="item-s-1827">
      content 1
    </div>
            [1] => <div class="item-s-1827">
      content 2
    </div>
            [2] => <div class="item-s-1827">
      content 3
    </div>
        )

    [1] => Array
        (
        [0] => 1827
        [1] => 1827
        [2] => 1827
    )

[2] => Array
    (
        [0] => 
  content 1

        [1] => 
  content 2

        [2] => 
  content 3

    )  ) */

通常,您可以在搜索字符串之前或之后使用正向lookbehinds/positive lookaheads断言字符串。在后看的情况下,图案必须具有与您的要求相冲突的固定长度。但幸运的是,有一个强大的替代方案:您可以使用
\K
(将文本保留在正则表达式之外),请参见:

\K
可用于重置从PHP 5.2.4开始的匹配开始。例如,模式
foo\Kbar
匹配“foobar”,但报告它已匹配“bar”。使用
\K
不会干扰捕获子字符串的设置。例如,当模式
(foo)\Kbar
匹配“foobar”时,第一个子字符串仍然设置为“foo”

这里是正则表达式(我对它做了一些额外的更改),带有
\K
和积极的前瞻性:

preg_match_all('/<div class="item-s-[0-9]+">\s*\K[^<]*?(?=\s*<\/div>)/', $html, $match);
print_r($match);

通常,您可以在搜索字符串之前或之后使用正向lookbehinds/positive lookaheads断言字符串。在后看的情况下,图案必须具有与您的要求相冲突的固定长度。但幸运的是,有一个强大的替代方案:您可以使用
\K
(将文本保留在正则表达式之外),请参见:

\K
可用于重置从PHP 5.2.4开始的匹配开始。例如,模式
foo\Kbar
匹配“foobar”,但报告它已匹配“bar”。使用
\K
不会干扰捕获子字符串的设置。例如,当模式
(foo)\Kbar
匹配“foobar”时,第一个子字符串仍然设置为“foo”

这里是正则表达式(我对它做了一些额外的更改),带有
\K
和积极的前瞻性:

preg_match_all('/<div class="item-s-[0-9]+">\s*\K[^<]*?(?=\s*<\/div>)/', $html, $match);
print_r($match);

在PHP中解析HTML的首选方法是加载HTML,然后搜索结果对象

更新

根据问题注释进行修改,以便
类名只需以
item-s-
开头

$html = '<div class="items">
    <div class="item-s-1827">
      content 1
    </div>
    <div class="item-s-18364">
      content 2
    </div>
    <div class="item-s-1827">
      content 3
    </div>
</div>';

$doc = new DomDocument();
$doc->loadHTML($html);
$xpath = new DomXPath($doc);
$divs = $xpath->query("//div[starts-with(@class,'item-s-')]");
foreach ($divs as $div) {
    $values[] = trim($div->nodeValue);
}
print_r($values);

在PHP中解析HTML的首选方法是加载HTML,然后搜索结果对象

更新

根据问题注释进行修改,以便
类名只需以
item-s-
开头

$html = '<div class="items">
    <div class="item-s-1827">
      content 1
    </div>
    <div class="item-s-18364">
      content 2
    </div>
    <div class="item-s-1827">
      content 3
    </div>
</div>';

$doc = new DomDocument();
$doc->loadHTML($html);
$xpath = new DomXPath($doc);
$divs = $xpath->query("//div[starts-with(@class,'item-s-')]");
foreach ($divs as $div) {
    $values[] = trim($div->nodeValue);
}
print_r($values);

希望得到什么结果?我只希望收到“内容1、内容2、内容3”。在每个div类中,在结束项-s-xxxx处有一个不同的数字,我想省略这些数字,因为它们不是必需的,但是,在我的公式中,有必要确保结果
$match[2]
应该包含您想要的是。但在本例中还有$match[0]和$match[1]。我认为在匹配时这是不必要的。例如,我想在表达式中使用类似的内容:(*)期望的结果是什么?我只希望接收“内容1、内容2、内容3”。在每个div类中,在结束项-s-xxxx处有一个不同的数字,我想省略这些数字,因为它们不是必需的,但是,在我的公式中,有必要确保结果
$match[2]
应该包含您想要的是。但在本例中还有$match[0]和$match[1]。我认为这在匹配时是不必要的。例如,我想在表达式中使用类似的内容:(*)