【问题标题】:preg_match_all and regexpreg_match_all 和正则表达式
【发布时间】:2013-01-23 02:45:09
【问题描述】:

我有大约 10-15 个链接的页面,所有链接都在我的控制范围内,并以名人之类的词结尾我想过滤所有以该词结尾的链接,所以我写了这个

    $regex='|<a.*?href="(.*_celebrity)"|';


    preg_match_all($regex,$result21,$parts);
$links=$parts[0];
foreach($links as $link){
{
    echo $link."<br>";
    mysql_query ("INSERT INTO tablea(linkssas) VALUES ('$link')");
    }

它完成这项工作并过滤所有以 _celebrity 结尾但输出未进入数据库的链接。所有链接都在一行中输入,它不是普通的,它是锚文本的形式,但我想要普通链接在数据库中,因为我正在使用 foreach,所以所有链接都应该在单独的行中输入,但所有行都在单行中输入,并且以锚点的形式输入,如 http://xyz.com/edje/jjeieied_celebrity"&gt;A&lt;/a&gt;

但我只想要数据库中的链接

【问题讨论】:

  • 您不应使用正则表达式来获取链接,而应使用 DOMDocument。请阅读:stackoverflow.com/questions/1732348/…
  • 听起来像是一个贪婪的正则表达式的问题。你真的想要href="(.*?_celebrity)",但是真的你最好使用适当的DOM解析器,比如DOMDocument或SimpleXML。
  • 这听起来像是 Tony The Pony 的工作......或者更好的是,read this,它很好地解释了为什么你不应该尝试使用正则表达式解析 HTML。

标签: php regex preg-match


【解决方案1】:

我觉得有义务为您提供DOMDocument 之旅:

$d = new DOMDocument();
$d->loadHTML($result21);

$suffix = "_celebrity"; $suffix_len = strlen($suffix);

foreach ($d->getElementsByTagName('a') as $link) {
    $href = $link->getAttribute('href');
    if ($href && substr($href, -$suffix_len) === $suffix) {
        // do your insert here
    }
}

或者,使用XPath 代替getElementsByTagName

$xp = new DOMXPath($d);

foreach($xp->query('//a[substring(@href, string-length(@href) - 9) = "_celebrity"]') as $node) {
    echo $node->getAttribute('href');
}

这是来自我们聊天室的消息:

Please, don't use mysql_* functions in new code。它们不再维护and are officially deprecated。看到red box?改为了解 prepared statements,并使用 PDOMySQLi - this article 将帮助您决定哪个。如果你选择 PDO,here is a good tutorial

【讨论】:

【解决方案2】:

您可能希望循环通过 $parts[1] 而不是 $parts[0]。

http://php.net/manual/en/function.preg-match-all.php

【讨论】:

  • 我不得不修改正则表达式,但在这种情况下使用正则表达式是不好的做法。这也是使用 mysql_query() 的坏习惯
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多