#php #regex
#php #регулярное выражение
Вопрос:
Строки выглядят как гиперссылки, такие как http://somethings . Это то, что мне нужно :
- Мне нужно проверять их, только если они не начинаются с символа
"
; Я имею в виду, только эти символы: если перед этим символов нет, он должен проверять; - Эта
somethings
строка означает, что можно использовать любой тип символов (конечно, это ссылка), кроме пробела (ссылка с конечным маркером); Я знаю, это разрешено RFC, но это единственный известный мне способ избежать; - эти строки предварительно фильтруются с помощью
htmlentities($str, ENT_QUOTES, "UTF-8")
, поэтому могут использоваться любые символы. Безопасно ли это? Или я рискую проблемами с xss или взломанным html? - случаев этой замены может быть несколько, а не только 1, и они должны быть без учета регистра;
Это мое фактическое регулярное выражение :
preg_replace('#b[^"](((http|https|ftp)://). )#', '<a class="lforum" href="$1">$1</a>', $str);
Но оно проверяет только те строки, которые НАЧИНАЮТСЯ с «, а я хочу наоборот. Любая помощь, отвечающая на этот вопрос, была бы хорошей, спасибо!
Комментарии:
1. 1 — вам нужно будет разбить слова на отдельные строки. Тогда регулярное выражение будет
[^"].*
2. [^»] должно работать, но если слово является первым словом, это не так (потому что перед этим нет никаких символов.
Ответ №1:
В обоих ваших случаях вам понадобятся утверждения lookbehind.
b(?<!")(w)b
— отрицательный просмотр назад для соответствия, только если ему не предшествует"
(?<=ThisShouldBePresent://)(.*)
— положительный поиск назад для соответствия, только если ему предшествует ваша строка.
Комментарии:
1. Отредактировал тему с некоторыми другими дополнительными сведениями (потому что это на самом деле работает не так хорошо); Пожалуйста, дайте мне знать, спасибо за ваше время
Ответ №2:
-
Что-то вроде этого:
preg_match('/b[^"]/',$input_string);
Выполняется поиск разрыва слова (
b
), за которым следует любой символ, отличный от двойной кавычки ([^"]
). -
Что-то вроде этого:
preg_match('~(((ThisShouldBePresent)://). )~');
Я предположил, что скобки, которые вы указали в вопросе (и знак плюс), были предназначены как часть регулярного выражения, а не символы для поиска.
Я также воспользовался советом @ThiefMaster и изменил разделитель на
~
, чтобы избежать необходимости экранировать//
.
Комментарии:
1. Возможно, вы захотите использовать другой разделитель для (2), чтобы у вас не было выхода из ада —
#
, например, отлично справился бы с этой задачей.2. @Thief — но мне нравится избегать моих косых черт; это делает синтаксис регулярных выражений еще более тупым! ура! 😉 (но да, я отредактировал его, чтобы использовать альтернативный символ)
3. Попробовал ваш пример, но он не работает (возможно, мы неправильно понимаем). Я отредактировал свою тему с более кратким объяснением 😉