正则表达式,如 gmail 搜索运算符 - PHP preg_match

发布于 2024-10-16 03:52:34 字数 571 浏览 1 评论 0原文

我正在尝试使用 PHP 中的函数 preg_match 来实现类似于 gmail 搜索运算符的系统来分割输入字符串。 示例:

输入字符串 =>命令1:字1 字2 命令2:字3 命令3:字4 字N
输出数组 => (
命令1:字1字2,
命令2:单词3,
命令3:word4 wordN

以下帖子解释了如何执行此操作:实现 Google 搜索运算符

我已经使用 preg_match 对其进行了测试但不匹配。我认为正则表达式可能会因系统而异。
猜猜 PHP 中的正则表达式如何解决这个问题?

preg_match('/\s+(?=\w+:)/i','command1:word1 word2 command2:word3 command3:word4 wordN',$test); 

谢谢,

I'm trying to implement a system similar to gmail search operators using function preg_match from PHP to split the input string .
Example:

input string => command1:word1 word2 command2:word3 command3:word4 wordN
output array => (
command1:word1 word2,
command2:word3,
command3:word4 wordN
)

The following post explains how to do it: Implementing Google search operators

I already test it using preg_match but doesn't match. I think regular expressions may change a bit from system to system.
Any guess how regex in PHP would match this problem?

preg_match('/\s+(?=\w+:)/i','command1:word1 word2 command2:word3 command3:word4 wordN',$test); 

Thanks,

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

海风掠过北极光 2024-10-23 03:52:34

你可以使用这样的东西:

<?php
$input = 'command1:word1 word2 command2:word3 command3:word4 wordN command1:word3';
preg_match_all('/
  (?:
    ([^: ]+) # command
    : # trailing ":"
  )
  (
    [^: ]+  # 1st word
    (?:\s+[^: ]+\b(?!:))* # possible other words, starts with spaces, does not end with ":"
  )
  /x', $input, $matches, PREG_SET_ORDER);

$result = array();
foreach ($matches as $match) {
  $result[$match[1]] = $result[$match[1]] ? $result[$match[1]] . ' ' . $match[2] : $match[2];
}

var_dump($result);

它甚至可以处理不同位置的相同命令(例如,“command1:”在开始和结束处)。

You can use something like this:

<?php
$input = 'command1:word1 word2 command2:word3 command3:word4 wordN command1:word3';
preg_match_all('/
  (?:
    ([^: ]+) # command
    : # trailing ":"
  )
  (
    [^: ]+  # 1st word
    (?:\s+[^: ]+\b(?!:))* # possible other words, starts with spaces, does not end with ":"
  )
  /x', $input, $matches, PREG_SET_ORDER);

$result = array();
foreach ($matches as $match) {
  $result[$match[1]] = $result[$match[1]] ? $result[$match[1]] . ' ' . $match[2] : $match[2];
}

var_dump($result);

It will cope even with same commands at different locations (eg. "command1:" at both the start and end).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文