从多个字符串中提取标记的最有效方法

时间:2013-04-10 18:43:20

标签: php regex preg-match

我有一个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

任何人都可以看到明显的错误吗?!

3 个答案:

答案 0 :(得分:2)

幸福的最短路径:

$pattern = '`<INCLUDEFILE-\d+-\K/[^>\s]+`';
preg_match_all($pattern, $subject, $results);
$results=$results[0];
print_r($results);

答案 1 :(得分:1)

我稍微更改了你的正则表达式并添加了括号来捕获你需要的子模式。我没有在发布的示例中看到引号(“),所以我更改为检查”&gt;“以检测结束。我还添加了ungreedy修饰符,您可以尝试使用或不使用ungreedy。我也检查result [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];
}

答案 2 :(得分: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);