用于拆分字符串的正则表达式,url除外



我需要在除/-以外的任何非字母数字字符上分割字符串。例如,在preg_split()中:

/[^a-zA-Z0-9/-]/

这工作得很好,但现在我想在所有这些点上分割字符串,除了,当这些字符在URL中找到时(即我想保持URL在一起)。我认为URL是一个以http://https://开头的以空格分隔的子字符串。换句话说:

My string. https://my-url.com?q=3 More strings.

应该拆分为:

[0] My
[1] string
[2] https://my-url.com?q=3
[3] More
[4] strings

我尝试过一些天真的方法,如/[^a-zA-Z0-9/-(https?://.s)]+/,但不幸的是,我不知道如何在字符类之外做到这一点,这显然没有给我想要的结果。

我现在使用PHP,我希望只使用preg_split(),但我开放更好,更全面的方式比这。

你不能只是把东西塞进字符类。所有东西都将被视为单个字符。您想要的是一个负向后看,以确保在匹配之前没有https?://(仅由非空白字符分隔)。但是只有。net支持变长后看。你可以反转输入、模式和结果来解决这个问题,但这有点过了头。从分割到匹配:

preg_match_all('~https?://S*|[a-zA-Z0-9/-]+~', $input, $matches);

现在$matches[0]将包含您想要的数组。

工作演示。

请注意,您可以将分隔符更改为几乎任何内容。这很有用,如果你有很多正斜杠,所以你不必转义它们。如果连字符是字符类中的最后一个字符,也不需要转义,但在这种情况下,是否转义是个人喜好的问题。

最新更新