4

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

我试过这个:

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

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

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

4

6 回答 6

6

当您将一堆字符放入字符类中时,如在 中[hello],这定义了一个与 h、e、l 或 o 字符匹配的标记。此外,|在字符类中没有任何意义 - 它只是作为普通字符匹配。

正确的解决方案不是使用字符类 - 你的意思是使用普通括号:

(\n|,|\.|".$exp.")

顺便说一句 - 确保您转义$exp. 基本上,这里的完整列表需要用反斜杠转义:http ://regular-expressions.info/reference.html可能有一个辅助函数可以为您完成。

编辑:由于您没有使用字符类,我们现在需要转义现在是元字符,意思是“匹配任何一个” \.差点忘了。

于 2013-05-18T23:42:58.853 回答
1

\n实际上只有一个字符,一个新行,(\前面的n表示转义序列)所以这就是它起作用而hello不起作用的原因。

另外,请记住,允许对正则表达式进行任意输入可能会带来安全风险,具体取决于您的正则表达式的用途,因此要非常小心并确保清理对该正则表达式的输入。

于 2013-05-18T23:40:34.697 回答
1

尝试使用这个正则表达式:

preg_split('#[\n,.]|'.$exp.'#', ...);

注意单引号,以避免\n被新行替换。

于 2013-05-18T23:42:17.450 回答
1

删除[and]因为它们定义了一个字符类。 \n计为双引号字符串中的单个字符。只需使用没有字符类的字符串就可以根据需要工作:

preg_split("/\n|,|.|$exp/", $input)
于 2013-05-18T23:42:33.140 回答
1

使用 preg_split()

例如:

输入:

$exp = '#';
preg_split("/[,.\n$exp]/", "0\n1,2.3#4")

输出:

Array ( [0] => 0 [1] => 1 [2] => 2 [3] => 3 [4] => 4)
于 2013-05-18T23:42:53.673 回答
1

这是一个简单的解决方案:

"(\n|,|\.|".$exp.")"

或者你可以这样做:

"([\n,.]|".$exp.")"
于 2013-05-18T23:45:19.950 回答