Мне нужно проверить файлы 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 Я не так уж много знаю о регулярных выражениях, что мне тогда использовать?
см. ответ @Jasmin Minstry. [qwert]* означает ноль или более из "набора" q, w, e, r или t. Таким образом, ваш [png|jpg|jpeg|PNG|JPG|JPEG]* также соответствует ppppp, |||| или просто пустой строке






Использовать
\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.";
}
пожалуйста, прекратите использовать
[в вашем случае