我需要用我知道但也未知的分隔符来分割字符串。 例如,我知道我想用“\ n”和“,”和“。”分割字符串。还有1个可以由用户定义的sperator:例如它可以是“;”或“你好”或几乎任何东西。
我试过了:
"[\n|,|.|".$exp."]"
......但是没有按预期工作。据我所知|意思是。所以这个reg exp应该说用“\ n”或“,”或“。”分隔。或“你好”。 我认为它是因为如果我尝试[hello]那么它会按每个字母而不是整个字分开。这很奇怪,因为如果我只尝试[\ n],那么它只会被“\ n”拆分 - 而不是“\”或“n”。
有人可以向我解释一下吗? :)
答案 0 :(得分:6)
当您在字符类中放置一堆字符时,如在[hello]
中,这定义了一个匹配一个字符h,e,l或o的标记。此外,|
在字符类中没有意义 - 它只是作为普通字符匹配。
正确的解决方案是不使用字符类 - 您打算使用普通括号:
(\n|,|\.|".$exp.")
顺便说一句 - 确保您转义$exp
中的任何正则表达式元字符。基本上,这里的完整列表需要使用反斜杠进行转义:http://regular-expressions.info/reference.html可能有一个辅助函数可以为你完成。
编辑:由于你没有使用角色类,我们现在需要逃离\
.
,这是一个元字符,意思是“匹配任何东西”。差点忘了。
答案 1 :(得分:1)
\n
实际上只有一个字符,一个换行符号(\
表示转义序列之前的n
)这就是为什么它有效并且hello
没有'吨。
另外,请记住,允许任意输入正则表达式可能存在安全风险,具体取决于正则表达式的用法,因此请务必小心并确保清理对该正则表达式的输入。 / p>
答案 2 :(得分:1)
尝试使用此正则表达式:
preg_split('#[\n,.]|'.$exp.'#', ...);
请注意单引号,以避免\n
被新行替换。
答案 3 :(得分:1)
删除[
和]
,因为它们定义了一个字符类。 \n
计为双引号字符串中的单个字符。只使用不带字符类的字符串应该可以根据需要使用:
preg_split("/\n|,|.|$exp/", $input)
答案 4 :(得分:1)
使用preg_split()
例如:
输入:
$exp = '#';
preg_split("/[,.\n$exp]/", "0\n1,2.3#4")
输出:
Array ( [0] => 0 [1] => 1 [2] => 2 [3] => 3 [4] => 4)
答案 5 :(得分:1)
这是一个简单的解决方案:
"(\n|,|\.|".$exp.")"
或者你可以这样做:
"([\n,.]|".$exp.")"