Иногда перед нами стоит задача найти и заменить сторонние ссылки в строке (тексте) и заменить их на нужные нам, например, перенаправляя сначала на страницу с информацией о перенаправлении.
К примеру, мы имеем строку:
$str='<p>Текст и <a hr_ef="https://google.com">какая-то ссылка</a></p>';
Не забудьте заменить hr_ef на href!
Чтобы заменить такую строку, нам необходимо использовать следующий PHP код:
//регулярное выражение
$reg_exUrl = "/(href=\"http|href=\"https)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/";
//пустой массив с будущими ссылками
$urlsA = array();
//еще массивчик
$urlsToReplace = array();
//проверяем, если есть совпадения во схождении, то выполняем замену
// я, к примеру, заменяю внешние ссылки на ссылку с перенаправлением
if(preg_match_all($reg_exUrl, $str, $urlsA)) {
//подсчитали количество имеющихся ссылок в массиве
$numOfMatches = count($urlsA[0]);
$numOfUrlsToReplace = 0;
//перебираем все через циклы for и добавляем немножечко рекурсии)
for($i=0; $i<$numOfMatches; $i++) {
$alreadyAdded = false;
$numOfUrlsToReplace = count($urlsToReplace);
for($j=0; $j<$numOfUrlsToReplace; $j++) {
if($urlsToReplace[$j] == $urlsA[0][$i]) {
$alreadyAdded = true;
}
}
if(!$alreadyAdded) {
array_push($urlsToReplace, $urlsA[0][$i]);
}
}
//еще один цикл заменяет ссылки на нужные нам
$numOfUrlsToReplace = count($urlsToReplace);
for($i=0; $i<$numOfUrlsToReplace; $i++){
if(
//если ссылки являются ссылками на мои домены, то я их не заменяю
stripos($urlsToReplace[$i],'inverser.pro')===false && stripos($urlsToReplace[$i],'usemind.org')===false
){
//если ссылки ведут на внешние домены, то я их заменяю
$str = str_replace($urlsToReplace[$i], 'target="_blank" href="https://link.inverser.pro/r2?l='.$rest = substr($urlsToReplace[$i], 6), $str);
}
}
}
Результат выполнения данного скрипта:
<p>Текст и <a target="_blank" href="https://link.inverser.pro/r2?l=https://google.com">какая-то ссылка</a></p>