使用 PHP 在 robots.txt 中搜索连续的 'User-agent' 指令

Search consecutive 'User-agent' directive in robots.txt with PHP

使用 PHP,我想检查 (true/false) robots.txt 文件中是否有连续的 'User-agent' 指令。

使用这个正则表达式,preg_match('~User-agent:\h*(?:\R|$)~i', $string) 我找到了所有 'User-agent:' 行,但我还没有找到如何检测连续行。

User-agent:    # 'User-agent:'
\h*            # horizontal whitespace (0 or more times)
(?:            # group, but do not capture:
  \R           #   '\R' (any Unicode newline sequence) 
 |             #  OR
  $            #   before an optional \n, and the end of the string
)              # end of grouping

例如

User-agent: 008
user-agent: Accoona
User-Agent: Googlebot
User-Agent: aipbot*
disallow: /

结果:正确

User-Agent: Googlebot
Crawl-delay: 60
User-agent: aipbot*
disallow: /

结果:

User-agent: 008
Crawl-delay: 2
user-agent: Accoona
User-Agent: Googlebot
User-Agent: aipbot*
disallow: /

结果:正确

这似乎是一个愚蠢的答案,但为什么不重复你的正则表达式呢?确定 User-agent:\h*(?:[a-zA-Z0-9\*]*\R|$)User-agent:\h*(?:[a-zA-Z0-9\*]*\R|$) 只有在有两个连续的用户代理时才匹配?

https://regex101.com/r/ximRMo/1

Add/remove non-user-agent 行之间的连续一个,0 匹配。连续两行导致匹配。

没有正则表达式:

$filePath = 'robots.txt';

try {
    if ( false === $fh = fopen($filePath, 'rb') )
        throw new Exception('Could not open the file!');

} catch (Exception $e) {
    echo 'Error (File: ' . $e->getFile() . ', line ' . $e->getLine() . '): ' . $e->getMessage();
}

var_dump(hasSuccessiveUA($fh));

fclose($fh);    

function hasSuccessiveUA($fh) {
    $previous = false;

    while ( false !== $line = fgets($fh) ) {
        $current = ( stripos($line, 'user-agent:') === 0 );
        if ( $previous && $current ) return true;
        $previous = $current;
    }

    return false;
}

优点:当答案为真时,您不必加载文件直到最后。