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

#php #regex

#php #регулярное выражение

Вопрос:

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

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

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

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

Но оно проверяет только те строки, которые НАЧИНАЮТСЯ с «, а я хочу наоборот. Любая помощь, отвечающая на этот вопрос, была бы хорошей, спасибо!

Комментарии:

1. 1 — вам нужно будет разбить слова на отдельные строки. Тогда регулярное выражение будет [^"].*

2. [^»] должно работать, но если слово является первым словом, это не так (потому что перед этим нет никаких символов.

Ответ №1:

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

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

Комментарии:

1. Отредактировал тему с некоторыми другими дополнительными сведениями (потому что это на самом деле работает не так хорошо); Пожалуйста, дайте мне знать, спасибо за ваше время

Ответ №2:

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

    Выполняется поиск разрыва слова ( b ), за которым следует любой символ, отличный от двойной кавычки ( [^"] ).

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

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

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

Комментарии:

1. Возможно, вы захотите использовать другой разделитель для (2), чтобы у вас не было выхода из ада — # , например, отлично справился бы с этой задачей.

2. @Thief — но мне нравится избегать моих косых черт; это делает синтаксис регулярных выражений еще более тупым! ура! 😉 (но да, я отредактировал его, чтобы использовать альтернативный символ)

3. Попробовал ваш пример, но он не работает (возможно, мы неправильно понимаем). Я отредактировал свою тему с более кратким объяснением 😉