1

我制作了一个简单的脚本来查找<a>网站的所有传出标签并显示它们。

为此,我首先抓取站点地图,将这些 URL 放入一个数组中,然后循环遍历各个 URL,分别抓取每个标签以查找<a>标签,然后strpos()在每个找到的标签上运行,看看它是否有任何我想忽略的 URL。

该脚本大约需要 5 分钟(抓取 500 页)才能完成(在本地运行),我想知道是否有更快的方法来处理针/干草堆搜索排除的参数。目前我正在使用

//SEES IF URL CONTAINS EXCLUDED PARAM
function find_excluded_url ($match_url) {
    return strpos($match_url, "mydomain.co.uk") ||
        strpos($match_url, "tumblr.com") ||
        strpos($match_url, "nofollow") ||
        strpos($match_url, "/archive") || 
        strpos($match_url, "page/2");
}

然后显示结果即时使用

if ( find_excluded_url($element) == false ) {
   echo "<a href='$element->href'>" . $element->href . "</a>";
} 

有没有更高效的方法来实现这一目标?

抱歉,如果这是一个非常明显的问题,这是我用 PHP 构建的第一个真实的东西

4

4 回答 4

0

如果要检查 1 个字符串是否在另一个字符串中,则应使用以下 2 个之一: http://php.net/manual/en/function.stristr.php
http://php.net/manual/en/函数.strstr.php

strpos 处的警告:“此函数可能返回布尔值 FALSE,但也可能返回非布尔值,其计算结果为 FALSE。有关更多信息,请阅读布尔值部分。使用 === 运算符测试此函数的返回值。”

/**
 * Loops through the array to see if one
 * of the values is inside the $needle
 *
 * @param  string $needle
 * @param  array  $haystack
 * @return bool
 */
function strstr_array($needle, array $haystack)
{
  foreach($haystack as $search) {
    if(strstr($needle, $search)) {
      return true;
    }
  }
  return false;
}

$haystack = array('my-domain.com', 'sub.my-domain.com');
var_dump(strstr_array('test my-domain.com or something', $haystack));
于 2013-04-10T11:37:45.903 回答
0
function find_excluded_url($match_url, $excludeList)
{
    foreach($excludeList as $excluded)
    {
        if(stristr($match_url, $excluded) !== FALSE)
        return TRUE;
        else return FALSE;
    }
}

$excludes = array(
                      'mydomain.co.uk'
                    , 'tumblr.com'
                    , 'nofollow'
                    , '/archive'
                    , 'page/2'
                 );

$example1 = 'http://example.mydomain.co.uk/dir/';
$example2 = 'https://not.in/excludes';
var_dump(find_excluded_url($example1, $excludes));
var_dump(find_excluded_url($example2, $excludes));

// output from browser:  bool(true) bool(false)
于 2013-04-10T12:53:46.483 回答
0

只需注意,如果元素位于字符串的开头并且元素不在字符串中,则strpos返回。0false

对于 PHP0false是同样的事情,这意味着您的脚本不会识别以关键字开头的链接。

所以我建议你把你的脚本改成这样:

function find_excluded_url ($match_url) {
    return strpos($match_url, "mydomain.co.uk") !== false ||
         strpos($match_url, "tumblr.com") !== false ||
         strpos($match_url, "nofollow") !== false ||
         strpos($match_url, "/archive") !== false || 
         strpos($match_url, "page/2") !== false;
}
于 2013-04-10T11:31:36.953 回答
0

尝试这个

if (preg_match('/word/i', $str))
于 2016-01-14T19:25:23.100 回答