正则表达式以分割除URL之外的字符串

时间:2013-04-17 18:58:38

标签: php regex preg-match-all preg-split

我需要在除/-之外的任何非字母数字字符上拆分字符串。例如,在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(),但我愿意接受更好,更全面的方式。

1 个答案:

答案 0 :(得分:2)

你不能把东西塞进角色类。一切都将被视为单个字符。你想要的是一个消极的lookbehind,它确保你的匹配之前没有https?://(仅由非空白字符分隔)。但只有.NET支持可变长度的lookbehinds。您可以反转输入和模式以及结果来解决这个问题,但这有点过分了。只需从分裂到匹配:

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

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

Working demo.

请注意,您可以将分隔符更改为pretty much anything。如果你有大量的正斜杠,这就派上用场了,所以你不必逃避它们。如果它是字符类中的最后一个字符,你也不需要转义连字符,但在这种情况下,无论你是否这样做都是一个品味问题。