我有一个像
这样的字符串$str = "hyper text-markup_language";
$keywords = preg_split("/[_,-, ]+/", $str);
我使用了preg_split,但它在下划线的基础上拆分字符串,而不是基于空格划分。
我想要这样的结果
[0] = hyper
[1] = text
[2] = markup
[3] = language
答案 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将其读作逗号之间的范围值(显然只是逗号)。
转义连字符并删除重复的逗号(方括号表示内部任何内容的列表)将生成一个数组。
方括号称为Character Sets 它们将匹配其中的任何内容。见这个例子。
/gr[ae]y/
这将匹配gray
和grey
。这是因为方括号与a
或e
匹配。将上述内容更改为/gr[a-e]y/
意味着gray
,grby
,grcy
,grdy
和grey
都会匹配。这是因为连字符(-
)是一个特殊字符,它将根据连字符之前的内容创建一个列表。
另一种选择(在@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。
答案 3 :(得分:1)
你应该这样写。
[-_ ]+