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