Php 用正则表达式搜索字符串中的子字符串,获取值,然后替换它

Php 用正则表达式搜索字符串中的子字符串,获取值,然后替换它,php,regex,search,replace,Php,Regex,Search,Replace,我有这样一个字符串: "bla blabla bla bla [bla:bla:bla] blabla blablabla [ble:ble:ble] bla bla bla" 我需要的是找到字符串中是否有“[*:*:*:*]”并获取内容。从这一点我想我知道如何替换它 为了更好地解释,字符串是对某事物的描述,在“[]”之间有一些参数用于构建url,因此我的字符串中可以有任意数量的“[]”,我需要内容,因为这是构建url所需的信息 提前谢谢 您可以使用\G在上一次匹配结束时声明位置,并在捕获组中

我有这样一个字符串:

"bla blabla bla bla [bla:bla:bla] blabla blablabla [ble:ble:ble] bla bla bla"
我需要的是找到字符串中是否有“[*:*:*:*]”并获取内容。从这一点我想我知道如何替换它

为了更好地解释,字符串是对某事物的描述,在“[]”之间有一些参数用于构建url,因此我的字符串中可以有任意数量的“[]”,我需要内容,因为这是构建url所需的信息


提前谢谢

您可以使用
\G
在上一次匹配结束时声明位置,并在捕获组中捕获
之间的内容:

(?:\[|\G(?!\A))([^:\][]+)(?::|\])
  • (?:
    非捕获组
    • \[
      匹配[
    • |
    • \G(?!\A)
      在上一个匹配的末尾而不是开始处断言位置
  • 关闭非捕获组
  • 捕获组1
    • [^:\][]+
      匹配字符类中列出的字符以外的任何字符的1+倍
  • 关闭第1组
  • (?::\])
    匹配:或]

或者使用and匹配
[*:*:*:*]
之间的3个子字符串以获得所有值:

$pattern = "/\[((?:[^:]+:){2}[^:]+)\]/";
$str = "bla blabla bla bla [bla:bla:bla] blabla blablabla [ble:ble:ble] bla bla bla";

preg_match_all($pattern, $str, $matches);

$result = array_map(function($x) {
    return explode(':', $x);
}, $matches[1]);

print_r($result);
结果

Array
(
    [0] => Array
        (
            [0] => bla
            [1] => bla
            [2] => bla
        )

    [1] => Array
        (
            [0] => ble
            [1] => ble
            [2] => ble
        )

)

您只需要在有两个以上的情况下才需要做什么,例如,
[*:*:*:*:*:*:*]
我得到了[(*?)(实际上我得到了“/[^]]*]/”),但问题是regex会捕获像我不想要的[text]这样的东西。匹配的格式必须为[::*]。其中始终有3个子字符串。我认为用于搜索和替换,但我认为OP希望中间的部分构建url,这就是为什么我选择了
preg\u match\u all
。如果将一个字符串传递给
preg\u replace\u callback
,那么也会返回一个字符串,然后仍然需要获取单独的部分。