2017-02-08 11 views
1

С PHP я хочу проверить (true/false), если в файле robots.txt есть последовательная директива «User-agent».Поиск последовательной директивы «User-agent» в файле robots.txt с PHP

С этим регулярным выражением, preg_match('~User-agent:\h*(?:\R|$)~i', $string) Я нашел строку «Пользователь-агент:», но я не нашел, как определить последовательные строки.

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:/

Результат: True

ответ

1

Это может показаться дерзким ответом, но почему бы не повторить регулярное выражение? Конечно, User-agent:\h*(?:[a-zA-Z0-9\*]*\R|$)User-agent:\h*(?:[a-zA-Z0-9\*]*\R|$) подходит только в том случае, если есть два последовательных пользовательских агента?

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

Добавить/удалить линии без пользовательского агента между последовательными один, 0 матчей. Сочетание двух последовательных строк.

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

Преимущество: когда ответ верно, вы не имеете не загрузить файл до конца.

 Смежные вопросы

  • Нет связанных вопросов^_^