Как правильно заменить строки, если у вас есть повторяющиеся подстроки? - PullRequest
0 голосов
/ 30 сентября 2019

Я хочу добавить гиперссылки на URL в тексте, но проблема в том, что у меня могут быть разные форматы, и в URL могут быть некоторые подстроки, повторенные в других строках. Позвольте мне объяснить это лучше на примере:

Here I have one insidelinkhttp://google.com But I can have more formats like the followings: https://google.com google.com

И сейчас у меня есть следующие ссылки, извлеченные из приведенного выше примера: ["http://google.com", "https://google.com", "google.com"], и я хочу заменить эти совпадения следующим массивом: ['<a href="http://google.com">http://google.com</a>', '<a href="https://google.com">https://google.com</a>', '<a href="google.com">google.com</a>']

Если я переберу массив, заменяющий каждый элемент, возникнет ошибка, как в приведенном выше примере, если я правильно добавлю гиперссылку для "http://google.com", каждая подстрока будет заменена другой гиперссылкой из "google.com"

Кто-нибудь знает, как решить эту проблему?

Спасибо

Ответы [ 2 ]

0 голосов
/ 30 сентября 2019

На основе вашей примерной строки я определил 3 различных шаблона для сопоставления URL-адресов и заменил их в соответствии с вашими требованиями. Вы можете определить больше шаблонов в переменной "$ regEX".

// string
$str = "Here I have one insidelinkhttp://google.com But I can have more formats like the followings: https://google.com google.com";

/**
 * Replace with the match pattern
 */
function urls_matches($url1)
{
  if (isset($url1[0])) {
    return '<a href="' . $url1[0] . '">' . $url1[0] . '</a>';
  }
}

// regular expression for multiple patterns
$regEX = "/(http:\/\/[a-zA-Z0-9]+\.+[A-Za-z]{2,6}+)|(https:\/\/[a-zA-Z0-9]+\.+[A-Za-z]{2,6}+)|([a-zA-Z0-9]+\.+[A-Za-z]{2,6}+)/";

// replacing string based on defined patterns
$replacedString = preg_replace_callback(
  $regEX,
  "urls_matches",
  $str
);

// print the replaced string
echo $replacedString;
0 голосов
/ 30 сентября 2019

Вы можете выполнить поиск и заменить их шаблонами. Например: STRINGA, STRINGB, STRINGC

Затем выполните цикл по массиву, где элемент 0 заменяет STRINGA. Просто убедитесь, что имена шаблонов не имеют перекрывающихся имен, таких как STRING1 и STRING10

...