我有以下字符串:
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:”
答案 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 它可能会离开行尾。所以我修改了这个
$
应删除它们。
我只是想起了“ duh”, $string = preg_replace('/^Q:.+(?:\r\n|\r|\n)/m', '', $string);
不能捕获任何东西,因此,因为它不能捕获任何东西,所以不会被替换。
您还可以先将数据分成几行,然后进行匹配测试,例如
$
答案 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);
结果:
Array
(
[1] => A: Red
[3] => A: George Clooney
)
然后implode()将其返回以得到所需的结果:
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
如果任何答案是多行的,因为它们有换行符,则您可以使用此代码同时获得这两行。
其他答案将仅捕获单行答案。
这将找到下一个问题,并在此处停止
$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