2017-02-08 8 views
1

PHPでは、robots.txtファイルに「User-agent」指示が連続しているかどうかをチェックしたいと思います。PHPで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:/

結果:真の

答えて

1

これはちょっとした答えと思われるかもしれませんが、正規表現を繰り返すのはなぜですか?確かにUser-agent:\h*(?:[a-zA-Z0-9\*]*\R|$)User-agent:\h*(?:[a-zA-Z0-9\*]*\R|$)は、2つの連続するユーザエージェントがある場合にのみ一致しますか?

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

追加/連続した1との間の非ユーザーエージェントの行を削除し、0試合。 2つの連続した行が一致する。正規表現がなければ

+0

Mais bien sur!しかし、User-Agentの説明には空白文字が含まれている可能性があります。これをキャプチャするには '[a-zA-Z0-9 \ *]'(https://regex101.com/r/ximRMo/4)を実行します。 – LeMoussel

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

利点:答えは真であるとき、あなたは最後までファイルをロードする必要はありません。

関連する問題