我需要在除/
和-
之外的任何非字母数字字符上拆分字符串。例如,在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()
,但我愿意接受更好,更全面的方式。
答案 0 :(得分:2)
你不能把东西塞进角色类。一切都将被视为单个字符。你想要的是一个消极的lookbehind,它确保你的匹配之前没有https?://
(仅由非空白字符分隔)。但只有.NET支持可变长度的lookbehinds。您可以反转输入和模式以及结果来解决这个问题,但这有点过分了。只需从分裂到匹配:
preg_match_all('~https?://\S*|[a-zA-Z0-9/-]+~', $input, $matches);
现在$matches[0]
将包含您想要的数组。
请注意,您可以将分隔符更改为pretty much anything。如果你有大量的正斜杠,这就派上用场了,所以你不必逃避它们。如果它是字符类中的最后一个字符,你也不需要转义连字符,但在这种情况下,无论你是否这样做都是一个品味问题。