如何拆分包含下划线,短划线和空格的字符串

时间:2017-04-17 12:15:43

标签: php regex string

我有一个像

这样的字符串
$str = "hyper text-markup_language";
$keywords = preg_split("/[_,-, ]+/", $str);

我使用了preg_split,但它在下划线的基础上拆分字符串,而不是基于空格划分。

我想要这样的结果

[0] = hyper
[1] = text
[2] = markup
[3] = language

4 个答案:

答案 0 :(得分:7)

简单明了的解决方案。

<?php
$str = "hyper text-markup_language";
$arr = preg_split("/[_,\- ]+/", $str);
var_dump($arr);
?>

这会产生此输出。

array (size=4)
  0 => string 'hyper' (length=5)
  1 => string 'text' (length=4)
  2 => string 'markup' (length=6)
  3 => string 'language' (length=8)

问题是当你编写-字符时,RegEx将其读作逗号之间的范围值(显然只是逗号)。

转义连字符并删除重复的逗号(方括号表示内部任何内容的列表)将生成一个数组。

RegEx解释

方括号称为Character Sets 它们将匹配其中的任何内容。见这个例子。

/gr[ae]y/

这将匹配graygrey。这是因为方括号与ae匹配。将上述内容更改为/gr[a-e]y/意味着graygrbygrcygrdygrey都会匹配。这是因为连字符(-)是一个特殊字符,它将根据连字符之前的内容创建一个列表。

另一种选择(在@anubhava评论之后)是将连字符放在字符集的开头或结尾处,以便它不需要转义,因为如果它前面或后面没有任何内容它就无法创建范围。

答案 1 :(得分:2)

@ user3056158您也可以在没有preg_split()的情况下执行此操作,如下所示:

<?php
  $str = "hyper text-markup_language";
  $str = str_replace(array(" ", "-", "_"), " ", $str);
  echo "<pre>";
  print_r(explode(" ", $str));
?>

答案 2 :(得分:1)

您的DECLARE @POSTALCODE VARCHAR(6) DECLARE @HOUSENUMBER INT SELECT @POSTALCODE = POSTALCODE FROM INSERTED SELECT @HOUSENUMBER = HOUSENUMBER FROM INSERTED IF NOT EXISTS ( SELECT PostalCode, MinNumber,MaxNumber FROM PostalCode_DB.DBO.PostalCodes_NL where @POSTALCODE = PostalCode and @HOUSENUMBER between MinNumber and MaxNumber ) BEGIN RAISERROR('Invalid combination postal code and house number', 16, 1) ROLLBACK TRANSACTION END 模式匹配一​​个或多个[_,-, ]+,空格或逗号的符号,它与连字符不匹配。见the demo here。原因是,在逗号和逗号之间创建了一个范围,因此只匹配逗号。

您可以使用[,-,]作为正则表达式模式来匹配集合中的一个或多个(由于[\s_-]+量词)符号(空格(与+匹配),{{ 1}}或\s(在字符类的末尾,它被解析为文字_符号))。

-

请参阅PHP demo

您可以阅读character classes at regular-expressions.info

答案 3 :(得分:1)

你应该这样写。

[-_ ]+