我做一个file_get_contents
得到一个长文件,我想找到以“MyParam”开头的行(只有一行)(例如)。
我不想逐行剪切文件,我想只用preg_match
(或等效的)来做。
我尝试过很多东西但没有成功。
提前致谢
文件内容
//some text
//some text
//MyParam "red"
//some text
MyParam "blue"
Some text
// Some text
我想只获得MyParam "blue"
。
答案 0 :(得分:2)
如果必须使用正则表达式,则可以按如下方式执行:
preg_match('/^MyParam[^\r\n]*/m', $text, $matches);
var_dump($matches[0]);
说明:
[^\r\n]
- 与\r
或\n
以外的任何字符匹配的字符类。 m
- multiline modifier,它改变了^
在字符串 开头的“断言位置”的含义“在每一行 的开头断言位置。”在这里,$matches[0]
将包含完整匹配的字符串(在这种情况下,就是您想要的)。
输出:
string(14) "MyParam "blue""
答案 1 :(得分:2)
使用file_get_contents不是最佳选择,因为您可以逐行读取文件
$handle = fopen("yourfile.txt", "r");
if ($handle) {
while (($line = fgets($handle)) !== false) {
if (strpos($line, 'MyParam')===0) {
echo 'found';
break;
}
}
} else {
echo 'error opening the file';
}
fclose($handle);
注意:如果需要在引号之间提取参数值,可以使用:
$value = explode('"', $line, 3)[1];
答案 2 :(得分:1)
您可以使用strpos()来查找字符串中第一次出现子字符串的位置。
答案 3 :(得分:1)
无需正则表达式:
$pos = strpos($filecontent, "\nMyParam");
$endline = strpos($filecontent, "\n", $pos + 1);
$line = substr($filecontent, $pos + 1, $endline - $pos - 1) ;
未经测试,字符串中可能存在+ -1的偏移,但它为您提供了想法。
修改:如果您确定“MyParam”未出现在文件的其他位置,则可以删除第一个“\ n”。
答案 4 :(得分:1)
我会考虑几种不同的方法。最重要的是要考虑您不需要通过file_get_contents()
将整个文件读入内存。我倾向于使用shell命令来执行此操作:
$file = '/path/to/file';
$search_pattern = '^MyParam';
$file_safe = escapeshellarg($file);
$pattern_safe = escapeshellarg($search_pattern);
$result = exec('grep ' . $pattern_safe . ' ' . $file_safe);
或者,您可以一次读取文件一行,查找匹配项:
$result = '';
$file = '/path/to/file';
$search = 'MyParam'; // note I am not using regex here as this is unnecessary in your case
$handle = fopen($file, 'r');
if ($handle) {
while($line = fgets($handle) !== false) {
if (strpos($line, $search) === 0) { // exact match is important here
$result = $line;
break;
}
}
fclose($handle);
}