有没有更简单的方法使用PHP正则表达式截取字符串?

3

我有一个字符串,看起来像这样:

Security/Flow_Setup/Steady_State/Verification

我只需要前两个级别(例如安全/流程设置)。有没有更简单的方法来获取这个。目前我使用'/'作为分隔符将字符串分解成数组,然后组合元素0和1。
这个方法可以实现,但我希望有一个更优雅的解决方案。
你有什么想法吗?

你看过dirname()函数吗?它可以很好地完成你想要的功能,而不需要任何混乱的正则表达式。(在你的情况下,如果你调用它两次) - Spudley
5个回答

7

如果您只需要前两部分,我认为您不可能找到比这更优雅/简短的了:

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

这里完全不需要正则表达式。

有人在评论中提到了dirname,我认为这是一个聪明而可能合适的想法,非常简短易读(并且可以获得所需的字符串,而不是像上面的代码一样分成两个部分):

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

echo dirname(dirname($str));

// Output: Security/Flow_Setup

3

我相信你一切都做得很好。如果你愿意,可以尝试以下方法:

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

(没有涉及到数组,应该会更快一些)

2

虽然这不是典型的用法或字符串函数,但由于您的字符串实际上是一个路径,也许这就足够了...

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

在我看来,这是最佳答案。使用dirname处理不是真正路径的字符串似乎有些奇怪,但谁知道呢 - 也许它确实是一个路径。 - Wesley Murch

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

0

这个正则表达式应该可以解决问题

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接