2012-05-14 40 views
3

我有一个字符串,它看起来像以下:有没有一种更简单的方法来截断PHP正则表达式的字符串?

Security/Flow_Setup/Steady_State/Verification 

我只需要前两个级别(例如安全/ Flow_Setup)是否有更简单的方法来得到这个。目前我爆炸串入一个数组使用:“/”作为分隔符,然后拼凑元素0和1

这工作,但我希望的一个更好的解决方案。

有什么想法?

+0

你见过'dirname()'函数?它几乎没有任何杂乱的正则表达式废话你正在寻找什么。 (如果你叫它两次,在你的情况下) – Spudley

回答

7

我不认为你可以得到比这也更优雅/短,如果你只需要前两个部分:

list($var1, $var2) = explode('/', $str); 

正则表达式是完全没有必要在这里。

有人在comments提到dirname,我认为是一个聪明的,可能适当的想法,很短,可读的(并且得到你所需要的,而不是像上面的代码中两个独立的部分字符串):

$str = 'Security/Flow_Setup/Steady_State/Verification'; 

echo dirname(dirname($str)); 

// Output: Security/Flow_Setup 
+0

这是优雅的!而且(至少对我来说)更具可读性。 –

0

这个表达式应该这样做

'/^([a-zA-Z]+\/[a-zA-Z]+)?/' 
3

我相信你所做的一切ok了。你可以尝试一下这种方式,如果你喜欢:

$str = "Security/Flow_Setup/Steady_State/Verification"; 
echo substr($str, 0, strpos($str, '/', strpos($str, '/') + 1)); 

(不涉及阵列,应该是快一点点)

+0

这似乎更好,我认为它更具可读性。 – user1216398

1

这里是最短和最快捷的班轮我可以想出:

$firstTwoParts = implode('/', array_slice(explode('/', $str, 3), 0, 2)); 

这可以被包装成它可以让你控制你要多少件功能:

function first_n_parts ($str, $n, $delimiter = '/') { 
    return ($n = (int) $n) ? implode($delimiter, array_slice(explode($delimiter, $str, $n + 1), 0, $n)) : ''; 
} 

...所以你可以这样做:

echo first_n_parts($str, 1); // Security 
echo first_n_parts($str, 2); // Security/Flow_Setup 
echo first_n_parts($str, 3); // Security/Flow_Setup/Steady_State 
2

不是一个典型的用法,也不是一个字符串函数,但因为你的字符串是一个有效的路径,也许这就够了......

dirname(dirname('Security/Flow_Setup/Steady_State/Verification')); 
+0

最佳答案IMO。在不是真正的路径的字符串上使用dirname看起来很尴尬,但是谁知道 - 也许它是一个。 –

相关问题