Php 是否删除以特定字符串开头的任何行?

Php 是否删除以特定字符串开头的任何行?,php,regex,Php,Regex,我有以下字符串: Q: What is your favorite color? A: Red Q: Who is your favorite actor? A: George Clooney 我想留下: A: Red A: George Clooney 有数百个可能的问题(Q:xyz?),所以我不能简单地替换每个特定的问题 PHP中是否有一个带有正则表达式的函数,允许我删除以下字符串开头的所有行:“Q:”您可以使用这个简单的正则表达式 $string = preg_replace('/^

我有以下字符串:

Q: What is your favorite color?
A: Red
Q: Who is your favorite actor?
A: George Clooney
我想留下:

A: Red
A: George Clooney
有数百个可能的问题(Q:xyz?),所以我不能简单地替换每个特定的问题


PHP中是否有一个带有正则表达式的函数,允许我删除以下字符串开头的所有行:“Q:”

您可以使用这个简单的正则表达式

 $string = preg_replace('/^Q:.+$/m', '', $string);
我使用了
m
标志,它应该使
^
匹配行的开头和
$
匹配行的结尾,但其中一些取决于输入是什么样的

当进行上述测试时 它可能会留下行尾。所以我把它改成这个

 $string = preg_replace('/^Q:.+(?:\r\n|\r|\n)/m', '', $string);
这应该会移除它们

我刚刚记得,
$
没有捕获任何东西,所以因为它没有捕获它,所以它不会被替换

您还可以先将数据分成几行,然后使用match进行测试,如下所示

$string = 'Q: What is your favorite color?
A: Red
Q: Who is your favorite actor?
A: George Clooney';

$lines = preg_split("/[\r\n]+/",$string);

$fixed = [];

foreach($lines as $line) if(!preg_match('/^Q:/', $line)) $fixed[] = $line;


echo implode(PHP_EOL, $fixed);

您可以使用preg\u match\u all并捕获所有答案

preg_match_all("/^A:.*$/m", $str, $m);
Echo implode(PHP_EOL, $m[0]);
模式

/^A: //must start with A:
.*   // Then anything
$    // to end of line
/m   // and make it multilined


如果任何答案都是多行的,例如,它们有一个换行符,您可以使用此代码获取两行。
其他答案将仅捕获单行答案。
这就找到了下一个问题,到此为止

$str = "Q: What is your favorite color?
A: Red.
As in the color of a rose.
Q: Who is your favorite actor?
A: George Clooney";
preg_match_all("/(A:.*?).Q: /ms", $str . "\nQ: ", $m);
Echo implode(PHP_EOL, $m[1]);
我用
$str添加了一个“额外问题”。“\nQ:”

这个输出

A: Red.
As in the color of a rose.
A: George Clooney

Id然后使用,例如:

<?php
$str = 'Q: What is your favorite color?
A: Red
Q: Who is your favorite actor?
A: George Clooney';

$array = explode(PHP_EOL, $str);

// get answers
$answers = array_filter($array, function ($value) {
    return substr($value, 0, 3) === 'A: ';
});

print_r($answers);
并返回到所需的结果:


那是字符串数组吗?不,没有这样的函数。您应该将从文件中读取行的函数(
fget
例如)和检查字符串中
Q:
位置的函数(
strpos
)结合起来。这里缺少冒号。
+
包括冒号;-)这会留下空白行,其中like以QYeah开头,我想如果输入仅以A:或Q:开头,这很好,但这也会匹配任何其他以Qbla-bla开头的行。。。。lol:)upvote+1表示不使用regexgood答案,但我会使用
return0===strpos($value,'A:')它应该比substr更快。通过使用<代码> 0 < /代码>我们知道它是字符串的开始:-),所以我们仍然可以确定是否存在Q:在中间,它不会删除它。我猜想性能是边缘的,超过1M迭代,<代码> StrpOS 1.0296秒< /代码>和<代码>子串1.0770秒< /代码>。好吧,无论哪种方式都可以,我只是选择了substr,因为它是第一个出现在我脑海中的。
Array
(
    [1] => A: Red
    [3] => A: George Clooney
)
A: Red
A: George Clooney