PHP preg_match. 添加到数组中

3
基本上,我正在尝试使用preg_match查找所有附有PDF附件的链接,然后将整个URL添加到数组中。我遇到的问题是如何选择匹配前的所有内容,直到<a href="">的引号。我想这样做是为了能够循环遍历数组,并对每个文档执行所需的操作。我只想在数组中得到'1234.pdf'(加上任何子目录信息)。
有什么想法吗?
到目前为止,这就是我拥有的,它只返回匹配项...
$string1 = "<a href='1234.pdf'>Document 1</a>";

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

谢谢


2
请注意,.不仅匹配句号字符,还会匹配任何其他字符(除了换行符);如果要仅匹配.,请进行转义。 - Gumbo
3个回答

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 针对正确的 PHP DOM 遍历技术提供实例。 - eykanal
非常完美。这是我第一次接触到 DOMDocument,非常有用,感谢您的帮助。 - shane

1
你应该使用一个合适的HTML解析器(参见netcoder的答案),并应用XPath表达式来解决这个问题。如果你一定要使用正则表达式,可以尝试像这样的方法:
$match = preg_match_all("/(?<=href=['\"])([^'\"]*\\.pdf[^'\"]*)(?=['\"])/",
                        $string1, $output);

这将匹配任何被引号包围的内容。 - Gumbo
@Gumbo:没错。我已经调整了正则表达式,至少要求href=前缀,但这显然是一种非常糟糕的方法来解决这个问题。我只是提供了一个后备正则表达式,以防万一OP没有遵循更好的方法,即使用适当的HTML解析器。你只能让这样的正则表达式表现得更好…… - cdhowie

0

如果我理解你的意思正确的话,似乎你需要使用子模式。尝试像这样做...

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

$output变量应该是一个数组,索引0包含完整的文本匹配,索引1包含括号内匹配的文本。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接