Как я могу создать собственное регулярное выражение для «разбора» ссылок HTML?

Строки выглядят как гиперссылки, такие как http: // somethings . Это то, что мне нужно:

  1. Мне нужно проверить их, только если они не начинаются с символа " , я имею в виду только те символы: если перед ними нет символов, он должен проверить;
  2. Эта строка somethings означает, что могут использоваться любые типы символов (конечно, это ссылка), за исключением пробела (ссылка конечного маркера); Я знаю, это разрешено RFC, но это единственный способ убежать;
  3. эти строки предварительно фильтруются с помощью htmlentities($str, ENT_QUOTES, "UTF-8") , поэтому можно использовать всевозможные символы. Это безопасно? Или я рискую проблемы с xss или html broked?
  4. случаи этой замены могут меня несколько, а не только 1, и должны быть случайными;

Это мое текущее регулярное выражение:

 preg_replace('#\b[^"](((http|https|ftp)://).+)#', '<a class="lforum" href="$1">$1</a>', $str); 

Но он проверяет только те строки, которые START с ", и я хочу наоборот. Любые ответы на этот вопрос будут полезны, спасибо!

  1. Что-то вроде этого: preg_match('/\b[^"]/',$input_string);

    Это ищет слово-break ( \b ), за которым следует любой символ, кроме двойной кавычки ( [^"] ).

  2. Что-то вроде этого: preg_match('~(((ThisShouldBePresent)://).+)~');

    Я предположил, что скобки, которые вы указали в вопросе (и знак плюса), были предназначены как часть регулярного выражения, а не для поиска символов.

    Я также принял совет @ ThiefMaster и изменил разделитель на ~ чтобы избежать необходимости избегать // .

Для обоих ваших случаев вам понадобятся утверждения lookbehind.

  1. \b(?<!")(\w)\b – отрицательный lookbehind для соответствия только если не предшествует "
  2. (?<=ThisShouldBePresent://)(.*) – положительный lookbehind, чтобы соответствовать только в том случае, если предшествует ваша строка.