【问题标题】:PHP preg_split() if it is NOT a number, + sign, bracket, new line or tabPHP preg_split() 如果它不是数字、+ 号、括号、换行符或制表符
【发布时间】:2022-01-02 20:21:00
【问题描述】:

我有以下操作,它在遇到字母时拆分字符串:

$splitOriginal = preg_split("/[a-zA-Z]/", implode('', array_slice($array, $key)), 2);

我想扩展它,当遇到的变量不是数字、括号、加号、连字符、换行符或制表符时,它会拆分字符串。

我写了一个可以匹配上面的正则表达式:

preg_match('/^(?=.*[0-9])[- +()0-9\r\n\t]+$/', $value)

但我需要否定它,以便在被比较的值不是它时匹配。非常感谢我能得到任何及时的帮助。

谢谢。

【问题讨论】:

  • 你能展示一个示例输入,以及结果数组应该是什么吗?
  • 看起来您应该只使用 '/[^\d()+\n\t-]/'preg_split。为什么切换到preg_match
  • @WiktorStribiżew 没有切换到preg_match,只是想显示我尝试使用的另一个正则表达式。感谢您的意见,将尝试。
  • @ChrisHaas 示例输入是任何同时包含字母、数字和符号的字符串。应该从头开始计数并在遇到不是数字、括号、加号、连字符、换行符或制表符的字符时拆分。

标签: php regex regex-negation regex-look-ahead


【解决方案1】:

[a-zA-Z] 模式匹配任何 ASCII 字母。任何字符“不是数字、括号、加号、连字符、换行符或制表符”也可以是字母,所以你应该关注后一个要求,你以前的模式不再相关。 p>

你应该继续使用preg_split:

$splitOriginal = preg_split('/[^\d()+\n\t-]/', implode('', array_slice($array, $key)), 2);

[^\d()+\n\t-] 模式与您制定的完全匹配。注意连字符,当它在字符类的末尾(或开头)时,可以不转义。

【讨论】:

  • 非常感谢。如何也为表达式添加空格?
  • @user627341 '/[^\d()+\n\t -]/'。或者也许只是使用'/[^\d()+\s-]/'。甚至'/[^\d()+\s-]+/u'.
  • 工作。非常感谢。
猜你喜欢
  • 2010-11-24
  • 2018-05-02
  • 2019-08-26
  • 2011-05-31
  • 2019-07-05
  • 2023-03-19
  • 1970-01-01
  • 2022-11-15
  • 1970-01-01
相关资源
最近更新 更多