file_get_contents + preg_match>找到以单词开头的行

时间:2014-05-05 15:11:33

标签: php regex preg-match file-get-contents

我做一个file_get_contents得到一个长文件,我想找到以“MyParam”开头的行(只有一行)(例如)。 我不想逐行剪切文件,我想只用preg_match(或等效的)来做。 我尝试过很多东西但没有成功。 提前致谢

文件内容

//some text
//some text
//MyParam "red"
//some text
MyParam "blue"
Some text
// Some text

我想只获得MyParam "blue"

5 个答案:

答案 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""

Demo

答案 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()来查找字符串中第一次出现子字符串的位置。

http://nl1.php.net/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);
}