Может ли 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
вызов функции.