У меня есть базовый скрипт в моем чат-движке, который ищет URL-адреса и делает их интерактивными для пользователей. Я использую php 5.6, поэтому получаю предупреждение о preg_replace и использую функцию обратного вызова. Хотя я могу сделать это обычно, используя функцию, я строю этот возврат, используя довольно сложный массив, и возвращаю его в другой сложный массив.
Вот код, который я сейчас использую:
return preg_replace(
array(
'/(?(?=<a[^>]*>.+</a>)(?:<a[^>]*>.+</a>)|([^ = "\']?)((?:https?|ftp|bf2|)://[^<> \n\r]+))/iex',
'/<a([^>]*)target = "?[^"\']+"?/i',
'/<a([^>]+)>/i',
'/(^|\s)(www.[^<> \n\r]+)/iex',
'/(([_A-Za-z0-9-]+)(\\.[_A-Za-z0-9-]+)*@([A-Za-z0-9-]+)(\\.[A-Za-z0-9-]+)*)/iex'
),
array(
"stripslashes((strlen('\\2')>0?'\\1<a href=\"\\2\">\\2</a> <i class=\"fas fa-external-link-alt\"></i>\\3':'\\0'))",
'<a\\1',
'<a\\1 target = "_blank">',
"stripslashes((strlen('\\2')>0?'\\1<a href=\"http://\\2\">\\2</a> <i class=\"fas fa-external-link-alt\"></i>\\3':'\\0'))",
"stripslashes((strlen('\\2')>0?'<a href=\"mailto:\\0\">\\0</a>':'\\0'))"
),
$text
);
Мой вопрос в том, как я могу переписать мой второй аргумент, чтобы он работал с использованием preg_replace_callback, поскольку я использую массивы. Этот ЯВЛЯЕТСЯ похож на некоторые другие вопросы, но они не возвращают свои значения и не сравнивают их с использованием массива, и я попытался написать функцию возврата, аналогичную той, что используют другие ответы, и она просто не работает. Любая помощь с этим будет оценена!
Не тестировал, но в комментариях есть PHP <7.
Спасибо за совет, он сильно отличается от исходного preg_replace_callback, поэтому мне нужно выяснить, как это сделать сейчас, ха-ха






См.
preg_replace_callback_array.