Мне нужно заменить биты ссылки в HTML коде:
<p style="text-align: justify;">
Many some boring text without images <a href="https://www.some-site.com/some/site/section /" target="_blank">some link text</a> - still some boring text without images
</p>
В конце ссылки перед слешем стоит пробел что ломает её. Но суть не в этом, для решения задачи я написал регулярку, которую засунул в функцию preg_replace_callback():
$textWithoutSpaces = preg_replace_callback(
'/(https:\/\/[\w_-]+(?:(?:\.[\w_-]+)+)[\w.,@?^=%&:\/~+#-]*[\w][ ]{1,}\/)/',
'self::deleteSpaces',
$text
);
Для того чтобы изменить ссылки в HTML использовал следующую конструкцию:
private static function deleteSpaces($match) {
return str_replace($match, str_replace(' ', '', $match), self::$currentText);
}
Совпадения по регулярке в $match, отлично находятся, эта конструкция:
str_replace(' ', '', $match)
Отлично убирает из них пробелы, вся проблема в том что в итоговый HTML код попадает лишний кусок взявшийся хрен знает от куда, который дублирует часть текста:
<p style="text-align: justify;">
Many some boring text without images <a href="<p style="text-align: justify;">
Many some boring text without images <a href="https://www.some-site.com/some/site/section /" target="_blank">some link text</a> - still some boring text without images
</p>
Пробовал переписать на:
private static function deleteSpaces($match) {
$positionToText = strpos(self::$currentEnDetailNewsText, $match);
return substr_replace(self::$currentEnDetailNewsText, str_replace(' ', '', $match), $positionToText, strlen($match));
}
Результат идентичен. Подскажите что не так? Или может быть какой-то альтернативный способ?