2

我正在尝试获取post 中第一个标签的href属性值,即image。 这是我到目前为止所拥有的: <a>

$pattern = "/<a.+href=('|\")(.*?).(bmp|gif|jpeg|jpg|png)('|\").*>/i";
$output = preg_match_all($pattern, $post->post_content, $matches);
$first_link = $matches[1][0];

但是,这不起作用

我有一个代码来获取一个有效的标签的src值:<img>

$pattern = "/<img.+src=[\'"]([^\'"]+)[\'"].*>/i";
$output = preg_match_all($pattern, $post->post_content, $matches);
$first_img = $matches[1][0];

因为我不是正则表达式和 php 的专家,所以我不知道我做错了什么。

此外,我找不到任何体面、有条理的正则表达式指南,因此指向一个的链接也很有用!

4

3 回答 3

3

这不是您应该使用正则表达式解决的问题。如果你想解析 HTML,你需要的是一个 HTML 解析器,而 PHP 已经为你准备了一个非常棒的!

$html = <<<HTML
<a href="http://somesillyexample.com/some/silly/path/to/a/file.jpeg">
HTML;

$dom = new DomDocument;
$dom->loadHTML($html); // load HTML from a string
$elements = $dom->getElementsByTagName('a'); // get all elements with an 'a' tag in the DOM
foreach ($elements as $node) {
    /* If the element has an href attribute let's get it */
    if ($node->hasAttribute('href')) {
        echo $node->getAttribute('href') . "\n";
    }
}
/*
will output:

http://somesillyexample.com/some/silly/path/to/a/file.jpeg
*/

有关更多详细信息,请参阅DOMDocument文档。

于 2012-12-08T17:09:21.023 回答
2

您应该为此使用 DOM 解析器。如果您可以使用 3rd 方库,请查看这个。它使您的任务变得异常简单:

$html = new simple_html_dom();
$html->load($post->post_content);

$anchor = $html->find('a', 0);
$first_link = $anchor->href;

如果由于某种原因不能使用这个库,使用PHP 的内置 DOM 模块仍然是比正则表达式更好的选择。

于 2012-12-08T17:06:37.083 回答
1

只是关于您的正则表达式的一些注释:

 "/<a.+href=('|\")(.*?).(bmp|gif|jpeg|jpg|png)('|\").*>/i"
      ^ that's greedy, should be +?
      ^ that's any char, should be not-closing-tag character: [^>]

 "/<a.+href=('|\")(.*?).(bmp|gif|jpeg|jpg|png)('|\").*>/i"
            ^^^^^^ for readability use ['\"]

 "/<a.+href=('|\")(.*?).(bmp|gif|jpeg|jpg|png)('|\").*>/i"
                       ^ that's any char, you might wanted \.

 "/<a.+href=('|\")(.*?).(bmp|gif|jpeg|jpg|png)('|\").*>/i"
                    ^^ that's ungreedy (good!)       ^ see above (greedy any char)

我现在无法测试它,因为我这里没有 PHP,但是纠正这些问题,也许你的问题已经解决了。还要检查切换默认“贪婪”的模式修饰符。 /U

然而,这个问题已经解决了很多次,所以你应该使用现有的解决方案(DOM 解析器)。例如,您不允许在 href 中使用引号(这对于 href 可能没问题,但稍后您将复制 + 粘贴您的正则表达式以解析另一个 html 属性,其中引号是有效字符)。

于 2012-12-08T17:15:51.080 回答