【问题标题】:php split string on first occurrence of a letterphp在第一次出现字母时拆分字符串
【发布时间】:2013-09-24 19:18:53
【问题描述】:

我有以下字符串

$string = "18/05-01/06 01/06-06/07 06/07-22/08 22/08-14/09 DR Record + 2 21.47 20.24 27.15 20.24 BE Record + 2 24.05 22.68"

我想在找到的第一个字母处拆分它(字母每次都不同)。我发现了一个类似的问题,有以下示例

$split = explode('-', 'orange-yellow-red',2);
echo $split[1]; //output yellow-red

但这是假设您知道字母是什么。有没有办法指定任何字母?我以前使用过 preg split,但这不能限制,而且我对正则表达式也不是很好。

如果explode 可以与正则表达式一起工作,那么这样的事情可能会起作用,但这只是一个例子,因为这不起作用。

$string = "18/05-01/06 01/06-06/07 06/07-22/08 22/08-14/09 DR Record + 2 21.47 20.24 27.15 20.24";
$split = explode([A-Za-z], $string,2);

【问题讨论】:

  • 等等..什么?不知道是什么的字母怎么拆分?
  • @Rohit 类似于拆分 [A-Za-z] 的东西,因此实际上您是在第一个字母上拆分,而不是任何其他类型的字符。

标签: php regex string split explode


【解决方案1】:

试试preg_split。

preg_split('/[a-z]/i', $string, 2);

我知道您想保留该字母 - 如果您希望它与之前的字符串一起使用,请使用后向:

preg_split('/(?<=[a-z])/i', $string, 2);

如果您希望它与后面的字符串一起使用,请使用前瞻:

preg_split('/(?=[a-z])/i', $string, 2);

如果您想将其分开,请增加拆分次数并同时使用。

preg_split('/(?<=[a-z])|(?=[a-z])/i', $string, 3);

给你:see it in action

【讨论】:

  • 如果我将 1 更改为 2,这将完美无缺。唯一的问题是,它是否删除了拆分的字母?有没有办法在字母前的空格上拆分它?
  • 是的,确实如此——你真正想要的结果是什么?
  • 我试图在第一个字母处拆分字符串并保持两个数组项完整
  • 但是explode和split操作都会删除exploded/split的部分。我的意思是:你想要字母在它之前的字符串上,还是在它之后的字符串上,还是作为它自己的项目?
  • 我想要之前的拆分,所以就像这样,例如array([0]=&gt;'18/05-01/06 01/06-06/07 06/07-22/08 22/08-14/09', [1]=&gt;'DR Record + 2 21.47 20.24 27.15 20.24 BE Record + 2 24.05 22.68');
【解决方案2】:

使用preg_split

$string = "18/05-01/06 01/06-06/07 06/07-22/08 22/08-14/09 DR Record + 2 21.47 20.24 27.15 20.24 BE Record + 2 24.05 22.68"

$stringArray = preg_split("/[a-zA-Z]/",$string,2);

[a-zA-Z] 告诉它找到第一个字母,然后从那里分裂

$stringArray 将保存两个结果字符串,注意它取出了它拆分的字母

您可以使用preg_match 来获取这两个字符串,这样它就不会去掉第一个字母

preg_match("/([^a-zA-Z]+)(.*)/",$string,$Matches);

这里的正则表达式告诉它捕获第一个字母之前的所有内容,然后捕获之后的所有内容

$Matches[1] 将包含

18/05-01/06 01/06-06/07 06/07-22/08 22/08-14/09 

而$Matches[2] 将包含

DR Record + 2 21.47 20.24 27.15 20.24 BE Record + 2 24.05 22.68

$Match[0] 保存匹配的整个字符串。

【讨论】:

  • $stringArray = preg_split(/[a-zA-Z]/,$string,2); 是一个错误,不是吗?
  • @FrankieTheKneeMan 错字,忘记引号
  • 谢谢! preg_match 似乎是我需要的东西!
  • 你真的不应该使用 preg_match - 使用正则表达式匹配验证上下文之外的整个字符串有点代码味道。
  • FrankieTheKneeMan 的第三种方案也不错,开头没有多余的数组元素
猜你喜欢
  • 2016-06-07
  • 2011-03-29
  • 2014-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-12
  • 1970-01-01
相关资源
最近更新 更多