2013-04-17 109 views
2

我需要拆分除/-之外的任何非字母数字字符的字符串。例如,在preg_split()正则表达式拆分除URL中的字符串

/[^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(),但我打开更好,更全面的方式比这个。

回答

2

你不能只将东西塞入角色类。一切将被视为单个字符。你会想要的是一个负面的后顾之忧,确保在比赛前没有https?://(仅由非空白字符分隔)。但是只有.NET支持可变长度的lookbehinds。您可以将输入和模式以及结果反转,以解决此问题,但这有点过分杀手。从分裂到匹配:

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

现在$matches[0]将包含您所需的数组。

Working demo.

注意,您可以分隔符更改为pretty much anything。这很方便,如果你有大量的正斜杠,所以你不必逃避它们。如果它是角色课程中的最后一个角色,则不需要跳过连字符,但在这种情况下,无论您是否喜欢,都是一种品味问题。

+1

哇!经过5年以上的PHP工作,我学到了一个崇高的真理:'preg_split()'中断了正则表达式匹配的字符串,'preg_match_all()'中断了正则表达式不匹配的字符串。这是我正在寻找的功能...而且更简单。谢谢。 – Matt

+1

@Matt这是一个有趣的方式来看待它。但是当你考虑捕获如何在这两种情况下工作时,它确实很有趣:在preg_match_all中捕获给出你返回的其他字符串的子串(忽略周边),并且preg_split给出了子串的内容, **返回(如果您使用'PREG_SPLOT_DELIM_CAPTURE');) –