【问题标题】:preg_match() to split a string by another string which is not in apostrophespreg_match() 用另一个不在撇号中的字符串分割一个字符串
【发布时间】:2015-06-26 20:59:42
【问题描述】:

我有很多这样的字符串:

parameter_1 >= '23' AND parameter_2 like 'cucurigu AND \picaso' AND parameter_3 IS NULL

我想在每个不在撇号内的 AND 之后创建一个 preg_split() 。 $matches 的输出应该是一个带有

的数组
0 => parameter_1 >= '23'
1 => parameter_2 like 'cucurigu AND \picaso'
2 => parameter_3 IS NULL

我不知道如何使用它。我确信有一个简单的解决方案可以使用 preg_split() 完成此操作。不幸的是,explode() 不能满足我的需要。 目前,我有一个巨大的代码,它逐个字符地将字符串拆分成一个数组,就像上面的那样。我需要将这个大代码更新为小代码,因为我的任务经常发生变化。

附:如果有人愿意帮助我,请添加 $pattern 的说明。

【问题讨论】:

  • 假设您没有转义引号:'[^']*'(*SKIP)(*FAIL)|\s*AND\s*。这不处理双引号。您可能想澄清有关上述两种情况的问题...

标签: php regex preg-split


【解决方案1】:

在这里,你可以使用skip/fail PCRE技巧,只捕获单引号外的AND

'[^']*?'(*SKIP)(*F)|AND

demo

result:

Array                                                                                                                                                                                                                                                  
(                                                                                                                                                                                                                                                      
    [0] => parameter_1 >= '23'                                                                                                                                                                                                                         
    [1] =>  parameter_2 like 'cucurigu AND \picaso'                                                                                                                                                                                                    
    [2] =>  parameter_3 IS NULL                                                                                                                                                                                                                        
)

说明: 我们用'[^']*?'(*SKIP)(*F) 跳过单引号内的所有内容,并在所有上下文中匹配AND

【讨论】:

  • 谢谢!你能不能也给我一个简短的解释?
  • @besciualex:我添加了一个简短的解释。
  • 也感谢演示链接。对测试和学习非常有用。
  • 在这里你可以找到更多关于这个技巧的信息:stackoverflow.com/questions/24534782/…
  • 好的,然后删除单词边界:'[^']*?'(*SKIP)(*F)|AND
猜你喜欢
  • 1970-01-01
  • 2017-11-30
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 2021-07-10
  • 2015-04-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多