【问题标题】:split string in numbers and text but accept text with a single digit inside在数字和文本中拆分字符串,但接受包含单个数字的文本
【发布时间】:2016-03-08 17:38:40
【问题描述】:

假设我想将此字符串拆分为两个变量:

$string = "levis 501";

我会用

preg_match('/\d+/', $string, $num);
preg_match('/\D+/', $string, $text);

但是假设我想把这个一分为二

$string = "levis 5° 501";

作为$text = "levis 5°";$num = "501";

所以我的猜测是我应该向preg_match('/\d+/', $string, $num); 添加一个规则,该规则仅在字符串的末尾查找数字,并且我希望它在 2 到 3 位之间。 但是 $text 匹配现在也有一个数字......

你会怎么做?

【问题讨论】:

标签: php regex string split preg-match


【解决方案1】:

要将字符串分成两部分,请使用以下任一方法:

preg_match('~^(.*?)\s*(\d+)\D*$~s', $s, $matches);

此正则表达式匹配:

  • ^ - 字符串的开头
  • (.*?) - 第 1 组捕获任何一个或多个字符,尽可能少(因为 *? 是一个“惰性”量词)最多...
  • \s* - 零个或多个空白符号
  • (\d+) - 第 2 组捕获 1 个或多个数字
  • \D* - 除数字以外的零个或多个字符(它是 \d 的相反简写字符类)
  • $ - 字符串结束。

~s 修饰符是一个 DOTALL 修饰符,它强制 . 匹配任何没有此修饰符时无法匹配的字符,甚至是换行符。

或者

preg_split('~\s*(?=\s*\d+\D*$)~', $s);

这个\s*(?=\s*\d+\D*$) 模式:

  • \s* - 零个或多个空格,但前提是后面跟...
  • (?=\s*\d+\D*$) - 零个或多个空格,后跟 1+ 数字,后跟 0+ 字符,而不是数字后跟字符串结尾。

(?=...) 构造是一个正向前瞻,它不消耗字符,只检查内部模式是否匹配,如果匹配,则返回“true”,如果不匹配,则不发生匹配。

IDEONE demo:

$s = "levis 5° 501";
preg_match('~^(.*?)\s*(\d+)\D*$~s', $s, $matches);
print_r($matches[1] . ": ". $matches[2]. PHP_EOL);
print_r(preg_split('~\s*(?=\s*\d+\D*$)~', $s, 2));

【讨论】:

  • 这个对我有用 "/^(.*?)\\s*(\\d+)$/" 。你或任何人能给我指点关于模式的教程或其他东西吗?
  • 我不知道你的正则表达式知识水平 :) 所以我只能建议在regexone.com 完成所有课程,阅读regular-expressions.inforegex SO tag description(还有许多其他链接到很棒的在线资源),以及名为 What does the regex mean 的社区 SO 帖子。
  • 我已经添加了解释。
  • 您好,谢谢我检查了它,我使用了这个“/^(.*?)\\s*(\\d+)$/”,因为它似乎工作正常。感谢您的澄清和链接,我检查了。
  • 非常高兴。谢谢你提出一个有趣的问题。让他们继续来! :-)
猜你喜欢
  • 2012-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-30
  • 1970-01-01
  • 2015-12-28
  • 2023-03-15
  • 1970-01-01
相关资源
最近更新 更多