繁体   English   中英

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

[英]php - split by unknown regular expression

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

我尝试了这个:

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

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

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

当您在字符类中放置一堆字符时,如[hello] ,这将定义与一个字符匹配的标记,该字符可以是h,e,l或o。 另外, | 在字符类内部没有任何意义-它只是作为普通字符进行匹配。

正确的解决方案不是使用字符类,而是要使用普通括号:

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

顺便说一句-确保您转义$exp任何正则表达式元字符。 基本上,这里的完整列表都需要使用反斜杠进行转义: http : //regular-expressions.info/reference.html可能有一个辅助函数可以为您完成此操作。

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

\\n实际上只是一个字符,换行( n之前的\\表示转义序列),因此这才起作用,而hello无效。

此外,请记住,根据正则表达式的用途,允许任意输入正则表达式可能会带来安全风险,因此请务必小心并确保将输入清理为该正则表达式。

尝试使用此正则表达式:

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

请注意单引号,以免\\n被换成新行。

删除[]因为它们定义了字符类。 \\n视为双引号字符串中的单个字符。 仅使用不带字符类的字符串即可按需要工作:

preg_split("/\n|,|.|$exp/", $input)

使用preg_split()

例如:

输入:

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

输出:

Array ( [0] => 0 [1] => 1 [2] => 2 [3] => 3 [4] => 4)

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

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

或者您可以像这样:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM