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

Php 从多个字符串中提取标记的最有效方法,php,regex,preg-match,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.ph

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

有人能看出明显的错误吗

您可以这样做:

$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);
$html='1!'
fadsf
asdfasfadsfaf
asdfadsf
';
$lines=explode(PHP\u EOL,$html);
$files=array();
foreach($line作为$line)
{
preg_match(“/”,$line,$match);
如果(!空($match)){
$files[]=$match[1];
}
}
var_dump($files);

您可以这样做:

$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);
$html='1!'
fadsf
asdfasfadsfaf
asdfadsf
';
$lines=explode(PHP\u EOL,$html);
$files=array();
foreach($line作为$line)
{
preg_match(“/”,$line,$match);
如果(!空($match)){
$files[]=$match[1];
}
}
var_dump($files);

我稍微更改了您的正则表达式,并添加了括号以捕获所需的子模式。在发布的示例中,我没有看到引号(“),因此我改为检查“>”以检测结尾。我还添加了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];
}
preg_match_all('/]+)>/Um',$html$result,preg_PATTERN_ORDER);
对于($i=0;$i
我稍微更改了您的正则表达式,并添加了括号以捕获所需的子模式。在发布的示例中,我没有看到引号(“),因此我改为检查“>”以检测结尾。我还添加了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];
}
preg_match_all('/]+)>/Um',$html$result,preg_PATTERN_ORDER);
对于($i=0;$i
通往幸福的捷径:

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

通往幸福的捷径:

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

你真的想在正则表达式中说
FILEINCLUDE
,而不是
INCLUDEFILE
?谢谢Robert指出这一点。。。我会更正并澄清。你真的是想在正则表达式中说
FILEINCLUDE
,而不是
INCLUDEFILE
?谢谢罗伯特指出这一点。。。我会更正和澄清。将它们放在一个数组中会很好,但由于它们可以随页面的不同而变化,我正在寻找一种更灵活的方法。。。答案可能是使用你的preg_比赛,我会试试!这将是伟大的,有他们在一个数组,但由于他们可以从一页到另一页,我正在寻找一个更灵活的方法。。。答案可能是使用你的preg_比赛,我会试试!