我在$text
中有以下文字:
$text = 'Hello world, lorem ipsum.
What?
Hello world, lorem ipsum what.
Excuse me!';
如果一行上的单词少于3个单词,那么我想完全删除该行。因此,应从字符串中删除包含What?
和Excuse me!
的行。
是否有正则表达式方法或我该怎么做?
答案 0 :(得分:3)
我想出了这个。尽可能避免使用正则表达式是我的偏好,因为正则表达式会降低速度。
$str = 'Hello world, lorem ipsum.
What?
Hello world, lorem ipsum what.';
$new_str = explode("\n", $str);
foreach ($new_str as $keys => &$lines) {
$lines = trim($lines);
if (substr_count($lines, " ") < 2) {
unset($new_str[$keys]);
}
}
$new_str = implode("\n", $new_str);
print_r($new_str);
打印出来:
Hello world, lorem ipsum.
Hello world, lorem ipsum what.
答案 1 :(得分:2)
您可以使用此负前瞻性正则表达式:
preg_replace('/^(?!(?:\h*\S+\h+){2}\S+).*\R*/m', '', $text);
<强>输出:强>
Hello world, lorem ipsum.
Hello world, lorem ipsum what.
(?!(?:\S+\h+){3})
将匹配任何没有3个非空格字的行。 \R
匹配PHP正则表达式中的换行符。
不前瞻使用preg_grep
:
echo implode("\n", preg_grep('/^\h*(?:\S+\h+){2}\S+/', explode("\n", $text)));
Hello world, lorem ipsum.
Hello world, lorem ipsum what.
答案 2 :(得分:1)
您可以在preg_replace
中使用此正则表达式:
$test = preg_replace("/^(?!\h*\S+\h+\S+\h+\S+).*$\R?/m", "", $text);
使用涉及某些其他边界条件的输入进行测试:
$text = 'Hello world, lorem ipsum.
What? ending-spaces
Hello world, lorem
Hello world, lorem ipsum what.
ending text';
$test = preg_replace("/^(?!\h*\S+\h+\S+\h+\S+).*$\R?/m", '', $text);
echo $test;
输出:
Hello world, lorem ipsum.
Hello world, lorem
Hello world, lorem ipsum what.
(?!
部分展望未来 - 在一些可选的horiontal空白(\h*
)之后 - 有三个单词(\S+
)
由(水平)空格(\h+
)分隔,如果是,则不匹配(因此不删除该行)。
在所有其他情况下,.*$
将匹配任何内容,直到该行结束,包括换行符(\R
)(如果存在)(?
)
并将被一个空字符串替换,以便删除该行。
m
修饰符将使^
和$
分别与行的开头和结尾匹配
(而不是完整字符串的开头和结尾)。
以下是使用上述输入和正则表达式的fiddle。