php preg_match。添加到数组

时间:2010-12-13 20:46:18

标签: php arrays preg-match

基本上我正在尝试使用preg_match查找带有PDF附件的所有链接,然后将整个url添加到数组中。我正在努力的部分是如何在比赛前选择所有内容,直到<a href="">的“引号”。我想这样做,这样我就可以循环遍历数组,并为每个文档做我需要的任何事情。我只想在数组中以'1234.pdf'(加上任何子目录信息)结束。

有什么想法吗?

这是我到目前为止,它只返回匹配...

$string1 = "<a href='1234.pdf'>Document 1</a>";

$match = preg_match("/.pdf/i", $string1, $output);

由于

3 个答案:

答案 0 :(得分:5)

您应该使用DOM解析器来提取该信息,因为它更容易,而且更安全。然后,您可以使用preg_match检查链接是否实际上是PDF:

$html = '<a href="foo.pdf">Foo</a>'.
        '<a href="bar.jpg">Bar</a>'.
        '<a href="baz.pdf">Baz</a>';

$dom = new DOMDocument;
$dom->loadHTML($html);
$links = $dom->getElementsByTagName('a');

$result = array();
foreach ($links as $link) {
   $href = $link->getAttribute('href');
   if (preg_match('/\.pdf$/i', $href)) $result[] = $href;
}

print_r($result);

输出:

Array
(
    [0] => foo.pdf
    [1] => baz.pdf
)

答案 1 :(得分:1)

您应该使用正确的HTML解析器(请参阅netcoder的答案)并应用XPath表达式来解决此问题。如果您受到约束并决定使用正则表达式,请尝试以下方法:

$match = preg_match_all("/(?<=href=['\"])([^'\"]*\\.pdf[^'\"]*)(?=['\"])/",
                        $string1, $output);

答案 2 :(得分:0)

如果我理解正确,听起来你需要使用子模式。尝试这样的事情......

$match = preg_match("/href=\"(.*\.pdf)\"/i", $string1, $output);

$ output变量应该是一个数组,索引0包含全文匹配,索引1包含从括号之间匹配的文本。