PHP Regex-如何在“换行符”之后删除字符串

时间:2018-11-14 02:56:41

标签: php regex

我有如下字符串:

Hi X

Blah

Kind regards
ABC

Hi X

Blah

Regards
CBA

因此关键是换行符和单词“ regards”(不区分大小写)。我想使用PHP在包含“问候”的行之前获取字符串的一部分。例如。对于这些示例,结果应仅为:

Hi X

Blah

我尝试了以下操作,但在某些情况下无法正常工作(例如,如果“种类”在字符串中多次出现)。预先感谢!

 $matches = array();
        if (preg_match("/\n(.*?)regards/i", $message, $matches) == 1) { 
            $stop_at = $matches[1]; 
            $split = explode($stop_at,$message); 
            $message = $split[0];
        }

2 个答案:

答案 0 :(得分:1)

您真正想要的是处理多行字符串的正则表达式。为此,您可以使用m标志(PCRE_MULTILINE)。

例如,我会使用preg_split()来拆分令牌上的字符串

$found = trim(preg_split('/^.*regards$/im', $message, 2)[0]);

演示〜https://3v4l.org/idMcP


一些注意事项:

  • 我已经使用trim()删除了“布拉” 之后的空行(您的示例排除了该行)
  • 我在preg_split()上设置了2个限制。鉴于您只检索第一个拆分,所以这是多余的,但在我看来,这意味着PHP的工作量较少(实际情况可能有所不同)。
  • 如果一行以“ regards” 结尾的单词结尾,但不一定是“ regards” 单词,这可能会失败,例如,我刚刚组成的这个单词< em>“ goregards” (就像护胫一样,但用于内脏)。

答案 1 :(得分:0)

您可以使用正则表达式

(?si).+\b(?=\n+[\w ]*regards)

它将匹配所有内容,直到一个单词边界,然后先查找换行符,然后再换行上面带有regards的行(可能由单词字符或空格组成)。

$str = "Hi X

Blah

Kind regards
ABC";
preg_match('/(?si).+\b(?=\n\s*[\w ]*regards)/', $str, $match);