0

我有 PHP 应用程序,我想在另一个词之后得到字符串“word”。它后面可以跟另一个字符串。

  1. 您好,这是状态:好的
  2. 您好,这是状态:好的。
  3. 您好,这是状态:好的,我喜欢它。

我想始终获得“好的”状态。请问该怎么做?

我有:

preg_match('~status:\s(.*)(?=\s.*)?~', $text, $matches);

但是在status:之后返回所有内容。

4

3 回答 3

2

您可以使用积极的后视来做到这一点,然后将每个单词字符放在后面。

(?<=status:\s)(\\w+)

演示

于 2018-05-24T11:13:26.023 回答
2

您可以替换(.*)(\w*)

preg_match('~status:\s(\w*)~', $text, $matches);

演示

修复当前方法的另一种方法是使点变得(.*)惰性,然后对当前的前瞻进行轻微更改:

preg_match('~status:\s(.*?)(?=\s|$)~', $text, $matches);
于 2018-05-24T11:13:28.783 回答
2

您可能会问为什么您当前的解决方案不起作用?

如果您在匹配后看到它与空白字符匹配status:,则匹配到行尾,.*然后回溯以查找存在空格的匹配项。如果后面的空格ok不立即存在或字符串后面的某处不存在,则找不到匹配项。解决方案:

status:\s+\K\w+

您不需要捕获组,也不应该量化前瞻。

在此处查看现场演示

PHP代码:

preg_match('~status:\s+\K\w+~', $text, $matches);
于 2018-05-24T11:17:17.430 回答