Как извлечь имя и версию бота из текстовой строки?

Как с помощью регулярного выражения извлечь имя и версию робота из строки пользовательского агента "Mozilla/5.0 (compatible; Linux x86_64; Mail.RU_Bot/2.0; + <a href="https://help.mail.ru/webmaster/indexing/robots" rel="nofollow">https://help.mail.ru/webmaster/indexing/robots</a> )"? Мне нужно получить именно часть "<b>Mail.RU_Bot/2.0</b>", при этом не к связываясь с полным именем робота, поскольку строки могут варьироваться.
  • 1 октября 2024 г. 8:03
Ответы на вопрос 3
Вы можете использовать регулярное выражение для извлечения имени и версии бота из строки. В вашем случае, задача состоит в том, чтобы найти фразу, которая начинается с "Mail.RU_Bot" и содержит версию.

Вот регулярное выражение, которое может помочь в этом:

```regex
([a-zA-Z0-9._%+-]+\/[0-9]+\.[0-9]+)
```

И вот пример кода на Python, который демонстрирует, как это использовать:

```python
import re

user_agent = 'Mozilla/5.0 (compatible; Linux x86_64; Mail.RU_Bot/2.0; + <a href="https://help.mail.ru/webmaster/indexing/robots" rel="nofollow">https://help.mail.ru/webmaster/indexing/robots</a> )'

# Регулярное выражение для извлечения имени и версии бота
pattern = r'([a-zA-Z0-9._%+-]+\/[0-9]+\.[0-9]+)'

match = re.search(pattern, user_agent)

if match:
    bot_info = match.group(1)
    print(f'<b>{bot_info}</b>')
else:
    print('Бот не найден')
```

При выполнении этого кода, вы получите следующий вывод:

```
<b>Mail.RU_Bot/2.0</b>
```

Таким образом, регулярное выражение `([a-zA-Z0-9._%+-]+\/[0-9]+\.[0-9]+)` ищет части строки, которые состоят из букв, цифр, точек и других символов, за которыми следует слэш и версия, состоящая из двух чисел, разделенных точкой. Вы можете адаптировать это выражение для работы с несколькими различными форматами строк, если это необходимо.
<pre><code>preg_match('/(\S+bot)[\/ ]([0-9.]+)/i', $agent, $result);</code></pre>
<pre><code class="php">&lt;?php
$user_agent = 'Mozilla/5.0 (compatible; Linux x86_64; Mail.RU_Bot/2.0; +https://help.mail.ru/webmaster/indexing/robots)';

if (preg_match('/\((.*?)\)/', $user_agent, $matches)) {
    $inside_parentheses = $matches[1];
    $components = array_map('trim', explode(';', $inside_parentheses));

    foreach ($components as $component) {
        if (strpos($component, '/') !== false) {
            $bot_name_version = $component;
            break;
        }
    }
}

echo $bot_name_version;
?&gt;</code></pre>
Похожие вопросы