-2

我正在尝试使用正则表达式从 HTML 文件中提取多个 URL。HTML 代码如下所示:

<h1 class="article"><a href="http://www.domain1.com/page-to-article1" onmousedown="return(...)
<h1 class="article"><a href="http://www.domain2.com/page-to-article2" onmousedown="return(...)
<h1 class="article"><a href="http://www.domain3.com/page-to-article3" onmousedown="return(...)
<h1 class="article"><a href="http://www.domain3.com/page-to-article4" onmousedown="return(...)

我想仅在<h1 class="article"><a href="和之间提取 URL," onmousedown="return(...)例如http://www.domain1.com/page-to-article1,http://www.domain2.com/page-to-article2http://www.domain3.com/page-to-article3

4

1 回答 1

4

正如已经回答和评论的那样,您不应该为此任务使用正则表达式。但是,如果你真的坚持,你可以使用这个正则表达式:

/\<h1 class="article"\>\<a href="([^"]*)" onmousedown="return/

创建此正则表达式的演练:

  1. 那么,你到底在寻找什么?像这样的一行:

    <h1 class="article"><a href="http://www.domain1.com/page-to-article1" onmousedown="return
    
  2. 但是,正则表达式中不允许使用某些字符。在此示例中,<and>字符是非法的。\因此,您应该通过在非法字符前添加反斜杠 ( ) 来转义它们:

    \<h1 class="article"\>\<a href="http://www.domain1.com/page-to-article1" onmousedown="return
    
  3. 这只会匹配正则表达式中已经存在的 URL。我们要匹配任何 URL。通常,在这种情况下,URL 看起来如何?这很难说,因为 URL 以许多不同的形式存在。

    一个简单的描述是:URL 是一堆不包含"字符的文本(因为这会结束标签的href属性)。<a>在正则表达式中,这将是[^"]:它匹配除 之外的任何字符"

    我们还没有完成一些事情:一个 URL 不仅仅是一个字符,除了",而是一大堆字符。因此,我们*在模式 ( ) 中添加一个星号 ( [^"]),它匹配零个或多个字符。这导致[^"]*. 现在可以匹配任意长度的 URL。

    我们不应该忘记我们实际上想要从文本中获取 URL(而不仅仅是匹配/检测它)。通过定义一个组,该组的内容将被单独返回。您可以通过将模式放在括号中来定义组。结果:([^"]*)

    现在我们可以将其替换为我们开始使用的模式:

    \<h1 class="article"\>\<a href="([^"]*)" onmousedown="return
    
  4. 我们应该做的最后一件事是告诉正则表达式处理器我们是要匹配整行(即,仅在我们的模式匹配整行时才查找结果),还是部分行。我们选择后一种选择。为此,我们将模式放在斜线中:

    /\<h1 class="article"\>\<a href="([^"]*)" onmousedown="return/
    
  5. 在最后一步,我们可以添加修饰符。这些就像正则表达式处理器在匹配您的模式时使用的首选项。我们添加i修饰符,使模式不区分大小写:

    /\<h1 class="article"\>\<a href="([^"]*)" onmousedown="return/i
    

我建议看一下正则表达式备忘单,并尝试了解正则表达式中发生了什么。将其添加到您的书签(或打印)。每当您遇到正则表达式或自己需要一个正则表达式时,请尝试使用它。如果您不熟悉正则表达式,它们似乎是一种很难的魔法,但如果您自己学会正确使用它们,它会非常方便。


示例使用:

<?php

$html = <<<EOF
<h1 class="article"><a href="http://www.domain1.com/page-to-article1" onmousedown="return(...)
<h1 class="article"><a href="http://www.domain2.com/page-to-article2" onmousedown="return(...)
<h1 class="article"><a href="http://www.domain3.com/page-to-article3" onmousedown="return(...)
<h1 class="article"><a href="http://www.domain3.com/page-to-article4" onmousedown="return(…)
EOF;

preg_match_all('/\<h1 class="article"\>\<a href="([^"]*)" onmousedown="return/i', $html, $matches);

print_r($matches[1]);
// Array
// (
//     [0] => http://www.domain1.com/page-to-article1
//     [1] => http://www.domain2.com/page-to-article2
//     [2] => http://www.domain3.com/page-to-article3
//     [3] => http://www.domain3.com/page-to-article4
// )

?>
于 2013-10-16T23:17:16.793 回答