PHP:如何在匹配和不匹配正则表达式模式的子字符串中拆分字符串?

时间:2016-11-12 16:04:02

标签: php regex string

我是新来的,需要你的帮助。我想匹配一个URI的字符串 - 并得到一个子串数组。

这是我的输入字符串:

/part-of-{INTERESETINGSTUFF}/an-url/{MORESTUFF}

我想要这个输出数组:

array(4) {
     [0]=>
     string(9) "/part-of-"
     [1]=>
     string(19) "{INTERESETINGSTUFF}"
     [2]=>
     string(8) "/an-url/"
     [3]=>
     string(11) "{MORESTUFF}"
}

我已经能够通过模式\{[^}]+\}使用大括号对所有内容进行preg_match。但是我怎样才能达到我想要的结果呢?

祝你好运!

2 个答案:

答案 0 :(得分:1)

这个怎么样? See on regex101

\/.*?(?={|\/)\/?|{.*?}

然后将匹配项存储在数组中。

  • \/.*?匹配/
  • 之后的所有字符 如果下一个字符为(?={|\/){ ,则
  • /会停止匹配
  • \/?在匹配结束时匹配可选/
  • {.*?}匹配括号和
  • 之间的所有内容

答案 1 :(得分:0)

您可以使用非常简单的({[^{}]*})正则表达式匹配{,除{以外的零个或多个符号以及} preg_splitPREG_SPLIT_DELIM_CAPTURE }选项(将所有捕获的子值放入结果数组中):

$str = '/part-of-{INTERESETINGSTUFF}/an-url/{MORESTUFF}';
$res = array_filter(preg_split('/({[^{}]*})/', $str, -1, PREG_SPLIT_DELIM_CAPTURE));
print_r($res);
// => Array( [0] => /part-of-  [1] => {INTERESETINGSTUFF}  [2] => /an-url/ [3] => {MORESTUFF} )

请参阅PHP demo

array_filter用于从结果数组中删除所有空元素。