目标消息与正则表达式匹配

时间:2018-08-10 09:53:11

标签: php regex

我必须实时检查csv文件并匹配一些表达式以获取数据。 这些文件可以具有不同类型的消息,因此具有不同的匹配表达式。 消息可能是这样的

  

116806 25374 K356 S Black Face.png 229 at 1的GuiPrinter.ProcessPrint   桌子

我想得到116806 25374 K356 S Black Face.png 。因此与这种文件相关联的正则表达式将类似于(GuiPrinter.ProcessPrint of )(.*)([.][png|jpg|jpeg|PNG|JPG|JPEG]*),我可以返回$result[2]

但是消息和正则表达式可以更改,因此我需要一个通用函数,该函数可以基于正则表达式返回我想要的字符串,该函数将具有messageregex参数。也许对于另一个文件,我想要的字符串将位于第一个位置,因此我的$result[2]无法正常工作。

如何确保始终返回要匹配的字符串?

2 个答案:

答案 0 :(得分:1)

使用

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

答案 1 :(得分:0)

您可以匹配文本GuiPrinter.ProcessPrint,然后使用\K重置报告的匹配的起点。

匹配任何字符零或多次非贪婪.*?,然后匹配点\.和非捕获组(?:gif|png|bmp|jpe?g)中的任何图像扩展名,然后匹配{{3} } \b

word boundary

请注意,要从字面上匹配点,您必须将其转义\.

例如,使用GuiPrinter\.ProcessPrint of \K.*?\.(?:gif|png|bmp|jpe?g)\b返回1个匹配项:

$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.";
}

preg_match