【问题标题】:Regular Expressions + preg_match_all - Getting the value of an attribute正则表达式 + preg_match_all - 获取属性的值
【发布时间】:2012-11-26 14:33:13
【问题描述】:

我正在尝试获取帖子中第一个<a> 标记的href 属性的值,这是一个图像
这是我到目前为止所拥有的:

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

但是,这不起作用

我有一个代码来获取&lt;img&gt; 标签的src 值,确实工作:

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

由于我不是正则表达式和 php 方面的专家,所以我不知道自己做错了什么。

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

【问题讨论】:

  • Here is the link you asked for。如果您通读本教程,您对正则表达式的掌握将大大增加。 But here is why you should rethink your overall approach。如果您向我们展示您的意见,这可能会有所帮助。最后,您的第二个示例可能无法正常工作,因为您使用 " 作为字符串,但转义了其中的 '
  • 感谢您的链接 - 我会读一读。至于为什么我应该重新考虑我的方法 - 很好的答案,这很有趣。不幸的是,这是我知道的唯一方法。请让我知道是否有任何其他方法可以更有效地做到这一点。至于第二个例子;最初,第二个示例中的 $pattern 直接嵌入在 $output 行中,我只是将其向上移动以便在示例之间进行比较。这也可能是第一个示例故障的原因,对吗?
  • ...你刚刚做到了!谢谢! :)
  • 是的,您现在拥有的两个答案基本上就是您拥有的两个选项。如果您可以使用我链接的库,则代码会变得更清晰,更易于阅读。如果没有,GoogleGuy 的方法就是要走的路。

标签: php regex wordpress preg-match-all


【解决方案1】:

这不是您应该使用正则表达式解决的问题。如果你想解析 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 文档。

【讨论】:

    【解决方案2】:

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

    $html = new simple_html_dom();
    $html->load($post->post_content);
    
    $anchor = $html->find('a', 0);
    $first_link = $anchor->href;
    

    如果由于某种原因你不能使用这个库,使用PHP's built-in DOM module 仍然是比正则表达式更好的选择。

    【讨论】:

    • 谢谢。我想我会采纳你的建议的。我看到的唯一问题是这适用于 all 链接。第一个链接也可以是文本链接,而不是图片链接...
    • 顺便说一句,我这样做的逻辑是 wordpress 会重新调整图像大小并将它们保存为新的,比原始图像小。因为我想获取帖子的第一张图片并将其用作缩略图,&lt;img&gt; 标签方法可能会导致缩略图模糊。这就是为什么我想使用链接到原始图像的&lt;a&gt; 标签。
    • 没关系!我刚刚阅读了文档。 [attribute*=value] 是我的答案 :)
    【解决方案3】:

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

     "/<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,但是纠正这些问题,也许你的问题已经解决了。还要检查pattern modifier/U,它会切换默认的“贪婪”。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-28
      • 2011-02-01
      • 2012-06-12
      相关资源
      最近更新 更多