我必须实时检查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]
但是消息和正则表达式可以更改,因此我需要一个通用函数,该函数可以基于正则表达式返回我想要的字符串,该函数将具有message
和regex
参数。也许对于另一个文件,我想要的字符串将位于第一个位置,因此我的$result[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
请注意,要从字面上匹配点,您必须将其转义\.
例如,使用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.";
}