Может ли preg_replace_callback() сохранить элементы переменной?

У меня есть серия больших строк уценки, которые содержат URL-адреса, большинство URL-адресов хороши, но некоторые из них были разбиты при изменении форматирования, у них было несколько черточек ("-"), замененных пробельными символами.

Я пытался использовать preg_replace_callback(), чтобы исправить это, когда они загружаются в PHP.

Примеры:

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

Поскольку все они содержатся в больших строках (которые обычно имеют 4-5 абзацев текста) и могут содержать 1-3+ URL-адреса в тексте, мне нужно перебрать их, захватить строку, удалить пробел, заменив ее на тире и вернуть его в нужное место.

В настоящее время я позаботился о соответствии:

$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() заключался в том, что он будет вызывать функцию каждый раз, когда встречает совпадение в строке, и помещает возврат функции в это место, но, как только я получаю сообщение об ошибке:

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

И строка 139 - это мое раннее объявление $postBody, я предполагаю, что preg_replace_callback() имеет дело со всеми совпадениями одновременно, поэтому я не уверен, как передать их обратно в строку, изменяя только пробелы в каждом?

1 ответ

Решение

Проблема, кажется, в этой строке:

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

Как $matches это массив, а не строковое значение.

Так должно быть:

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

$matches[0] представляет всю согласованную строку из preg_replace_callback вызов функции.

Другие вопросы по тегам