使用 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;
}
优点:当答案为真时,您不必加载文件直到最后。
使用 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;
}
优点:当答案为真时,您不必加载文件直到最后。