【问题标题】:Better way to write multiple strpos calls编写多个 strpos 调用的更好方法
【发布时间】:2013-04-10 11:25:04
【问题描述】:

我制作了一个简单的脚本,可以找到网站的所有传出 <a> 标记并显示它们。

为此,我首先抓取站点地图,将这些 URL 放入一个数组中,然后遍历 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 构建的第一个真实的东西

【问题讨论】:

    标签: php performance strpos


    【解决方案1】:

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

    对于 PHP,0false 是一回事,这意味着您的脚本不会识别以关键字开头的链接。

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

    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;
    }
    

    【讨论】:

    • 我刚刚更新了我上面的问题,以显示我如何调用该函数,这与您编写函数的方式有相同的效果吗?
    • 不要尝试将 $match_url 设置为 mydomain.co.uk 并使用您的代码,如果您不添加“!== false”,该函数将不会将其识别为匹配,这就是原因为什么我建议您将其添加到您的功能中。但是,如果您担心速度,请记住调用函数会增加代码开销,因此我建议您在 if 中内联 strpos,我认为它会稍微快一些。
    【解决方案2】:

    如果要检查 1 个字符串是否在另一个字符串中,则应使用以下 2 个之一: http://php.net/manual/en/function.stristr.php
    http://php.net/manual/en/function.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));
    

    【讨论】:

    • 问题是关于性能的。手册清楚地说明了 strstr:“如果您只想确定某个特定的针是否出现在 haystack 中,请改用更快且内存占用更少的函数 strpos()。”
    【解决方案3】:
    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)
    

    【讨论】:

      【解决方案4】:

      试试这个

      if (preg_match('/word/i', $str))
      

      【讨论】:

      • 请永远解释你的答案。
      猜你喜欢
      • 2017-07-08
      • 1970-01-01
      • 2019-08-01
      • 1970-01-01
      • 2014-10-22
      • 1970-01-01
      • 2019-08-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多