Php 是否可以在preg_match中排除匹配字符串的部分?
当编写一个脚本从一个特定的div下载内容时,我想知道是否可以跳过模式的某些部分,这样它就不会包含在匹配结果中 例如: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> <
<?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]。我认为这在匹配时是不必要的。例如,我想在表达式中使用类似的内容:(*)