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组)
匹配:或](?::\])
[*:*:*:*]
之间的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
,那么也会返回一个字符串,然后仍然需要获取单独的部分。