php - 由未知的正则表达式拆分

时间:2013-05-18 23:37:53

标签: php regex

我需要用我知道但也未知的分隔符来分割字符串。 例如,我知道我想用“\ n”和“,”和“。”分割字符串。还有1个可以由用户定义的sperator:例如它可以是“;”或“你好”或几乎任何东西。

我试过了:

"[\n|,|.|".$exp."]"

......但是没有按预期工作。据我所知|意思是。所以这个reg exp应该说用“\ n”或“,”或“。”分隔。或“你好”。 我认为它是因为如果我尝试[hello]那么它会按每个字母而不是整个字分开。这很奇怪,因为如果我只尝试[\ n],那么它只会被“\ n”拆分 - 而不是“\”或“n”。

有人可以向我解释一下吗? :)

6 个答案:

答案 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.")"