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

时间:2018-09-04 16:04:47

标签: php regex

我有以下字符串:

Q: What is your favorite color?
A: Red
Q: Who is your favorite actor?
A: George Clooney

我想留下来:

A: Red
A: George Clooney

有数百个可能的问题(问:xyz?),所以我不能仅仅str_replace每个特定的问题。

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

3 个答案:

答案 0 :(得分:3)

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

ORDER BY
    CAST(CASE WHEN PATINDEX('%[0-9]%',col) > 0
              THEN SUBSTRING(SUBSTRING(col,PATINDEX('%[0-9]%',col),100), 1, PATINDEX('%[^0-9]%', SUBSTRING(col,PATINDEX('%[0-9]%',col),100)+'#')-1) 
              ELSE '0'
          END AS FLOAT)
    ,col

我使用了 $string = preg_replace('/^Q:.+$/m', '', $string); 标志,该标志应使m与行的开头匹配,而^与行的结尾匹配,但这取决于输入的内容。

进行上述测试时 Sandbox 它可能会离开行尾。所以我修改了这个

$

应删除它们。

Sandobx

我只是想起了“ duh”, $string = preg_replace('/^Q:.+(?:\r\n|\r|\n)/m', '', $string); 不能捕获任何东西,因此,因为它不能捕获任何东西,所以不会被替换。

您还可以先将数据分成几行,然后进行匹配测试,例如

$

Sandbox

答案 1 :(得分:3)

Id先使用explode(),然后再使用array_filter(),例如:

<?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);

https://3v4l.org/6UKLZ

结果:

Array
(
    [1] => A: Red
    [3] => A: George Clooney
)

然后implode()将其返回以得到所需的结果:

https://3v4l.org/Esj98

A: Red
A: George Clooney

答案 2 :(得分:2)

您可以使用preg_match_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

https://3v4l.org/LPB25


如果任何答案是多行的,因为它们有换行符,则您可以使用此代码同时获得这两行。
其他答案将仅捕获单行答案。
这将找到下一个问题,并在此处停止

$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

https://3v4l.org/UCArm