如果line少于x个单词,则将其删除

时间:2015-12-30 16:44:18

标签: php regex

我在$text中有以下文字:

$text = 'Hello world, lorem ipsum.

What?

Hello world, lorem ipsum what.

Excuse me!';

如果一行上的单词少于3个单词,那么我想完全删除该行。因此,应从字符串中删除包含What?Excuse me!的行。

是否有正则表达式方法或我该怎么做?

3 个答案:

答案 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.

RegEx Demo

Code Demo

答案 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