preg_replace_callback() 可以保留变量的元素吗?

Can preg_replace_callback() preserve elements of the variable?

我有一系列包含 URL 的大型 markdown 字符串,大多数 URL 都很好,但其中一些在更改格式时损坏了,它们有一些破折号(“-”)已更改进入空白字符。

我一直在尝试使用 preg_replace_callback() 在 PHP.

中加载它们时修复它们

示例:

[Site Name](http://www.siteurl.com/this-is-the-website broken url)

由于这些都包含在大字符串中(通常有 4-5 段文本)并且文本中可能有 1-3+ 个 URL,我需要遍历它们,捕获字符串,删除空格用破折号替换它,return它到正确的位置。

目前我已经完成了匹配:

$postBody = preg_replace_callback("^(\([A-Za-z\:\/0-9\-.\s]*\))^",'urlcallback', $postBody);

我尝试创建函数:

function urlcallback ($matches) {
static $id = 0;
$matches[$id] = preg_replace("^\s^", "-", $matches);
return $matches[$id];
$id++;
}

我对 preg_replace_callback() 的理解是,它会在每次遇到字符串中的匹配项时调用该函数,并将该函数的 return 放在那个位置,但是因为我我收到错误:

Notice: Array to string conversion in cleanup.php at line 139

第 139 行是我早期的 $postBody 声明,我假设 preg_replace_callback() 同时处理所有匹配项,所以我不确定如何将它们传回字符串而只更改每个空格中的空格?

问题似乎出在这一行:

$matches[$id] = preg_replace("^\s", "-", $matches);

因为 $matches 是数组而不是字符串值。

应该是:

$matches[$id] = preg_replace('/\s/', "-", $matches[0]);

$matches[0] 表示来自 preg_replace_callback 函数调用的整个匹配字符串。