Целевое сообщение для соответствия с регулярным выражением

Мне нужно проверить файлы csv вживую и сопоставить какое-то выражение, чтобы получить данные. Эти файлы могут иметь разные типы сообщений, поэтому разные выражения соответствия. Сообщение может быть примерно таким

GuiPrinter.ProcessPrint of 116806 25374 K356 S Black Face.png 229 at 1 table

И хочу получить 116806 25374 K356 S Black Face.png . Таким образом, регулярное выражение, связанное с таким файлом, будет чем-то вроде (GuiPrinter.ProcessPrint of )(.*)([.][png|jpg|jpeg|PNG|JPG|JPEG]*), и я могу вернуть $result[2]

Но сообщение и регулярное выражение могут измениться, поэтому мне нужна общая функция, которая может возвращать нужную мне строку на основе регулярного выражения, функция будет иметь параметры message и regex. Возможно, для другого файла строка, которую я хочу, будет на первой позиции, поэтому мой $result[2] не будет работать.

Как я могу гарантировать, что всегда буду возвращать ту строку, которая мне нужна?

пожалуйста, прекратите использовать [ в вашем случае

Fallenhero 10.08.2018 11:55

если вы знаете все типы сообщений, вы можете создать одно регулярное выражение, которое будет соответствовать им всем

Robert 10.08.2018 12:04

@Fallenhero Я не так уж много знаю о регулярных выражениях, что мне тогда использовать?

Simon M. 10.08.2018 12:06

см. ответ @Jasmin Minstry. [qwert]* означает ноль или более из "набора" q, w, e, r или t. Таким образом, ваш [png|jpg|jpeg|PNG|JPG|JPEG]* также соответствует ppppp, |||| или просто пустой строке

Fallenhero 10.08.2018 14:20
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
4
38
2

Ответы 2

Использовать

\preg_match('/GuiPrinter.ProcessPrint of(.*?)\.(gif|png|bmp|jpe?g)/', $str, $match);
print_r($match[1]);

Вы можете сопоставить текст GuiPrinter.ProcessPrint, а затем использовать \K для сброса начальной точки сообщаемого совпадения.

Сопоставьте любой символ, ноль или более раз, нежадный .*?, затем сопоставьте точку \. и любое из расширений изображения в группе без захвата (?:gif|png|bmp|jpe?g), за которой следует граница слова\b

GuiPrinter\.ProcessPrint of \K.*?\.(?:gif|png|bmp|jpe?g)\b

Обратите внимание, что для того, чтобы буквально сопоставить точку, вам нужно избежать ее \.

Например, чтобы вернуть 1 совпадение с помощью preg_match:

$str = 'GuiPrinter.ProcessPrint of 116806 25374 K356 S Black Face.png 229 at 1 table';
$re = '/GuiPrinter\.ProcessPrint of \K.*?\.(?:gif|png|bmp|jpe?g)\b/';

function findMatch($message, $regex) {
    preg_match($regex, $message, $matches);
    return array_shift($matches);
}

$result = findMatch($str, $re);

if ($result) {
    echo "Found: $result";
} else {
    echo "No match.";
}

Демо

Другие вопросы по теме