0

我有一个 html 页面,其中包含以下标签的多个实例:

<INCLUDEFILE-1-/var/somepath/file1.php>
<INCLUDEFILE-2-/var/somepath/file2.php>
<INCLUDEFILE-3-/var/somepath/file3.php>
<INCLUDEFILE-4-/var/somepath/file4.php>
<INCLUDEFILE-5-/var/somepath/file5.php>

我可以使用什么代码来提取上面的所有路径?到目前为止,我已经获得了以下代码,但无法使其正常工作:

preg_match_all('/INCLUDEFILE[^"]+/m', $html, $result, PREG_PATTERN_ORDER);

for ($i = 0; $i < count($result[0]); $i++)
{
    $includefile = $result[0][$i];
}

我需要提取:

/var/somepath/file1.php
/var/somepath/file2.php
/var/somepath/file3.php
/var/somepath/file4.php
/var/somepath/file5.php

谁能看到明显的错误?!

4

3 回答 3

2

通往幸福的捷径:

$pattern = '`<INCLUDEFILE-\d+-\K/[^>\s]+`';
preg_match_all($pattern, $subject, $results);
$results=$results[0];
print_r($results);
于 2013-04-11T19:11:06.297 回答
1

我稍微更改了您的正则表达式并添加了括号来捕获您需要的子模式。我在发布的示例中没有看到引号(“),所以我改为检查“>”来检测结尾。我还添加了 ungreedy 修饰符,您可以尝试使用或不使用 ungreedy 的情况。我还检查结果[1] 将包含第一个子模式匹配项。

preg_match_all('/<INCLUDEFILE-[0-9]+-([^>]+)>/Um', $html, $result, PREG_PATTERN_ORDER);

for ($i = 0; $i < count($result[1]); $i++)
{
    $includefile = $result[1][$i];
}
于 2013-04-10T18:59:14.110 回答
0

你可以这样做:

$html = '
    <INCLUDEFILE-1-/var/somepath/file1.php>fadsf
    asdfasf<INCLUDEFILE-2-/var/somepath/file2.php>adsfaf
    <INCLUDEFILE-3-/var/somepath/file3.php>asdfadsf
    <INCLUDEFILE-4-/var/somepath/file4.php>
    <INCLUDEFILE-5-/var/somepath/file5.php>
';

$lines = explode(PHP_EOL, $html);
$files = array();

foreach($lines as $line)
{
    preg_match('/<INCLUDEFILE-\d+-(.+?)>/', $line, $match);
    if(!empty($match)) {
        $files[] = $match[1];
    }
}

var_dump($files);
于 2013-04-10T18:54:31.330 回答