У меня есть это регулярное выражение
(?i)\b((?:https?://|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))
но у меня проблемы с запятой. Избегая запятой, как это \,
не решает проблему. Что я могу сделать, чтобы заставить это регулярное выражение работать?
Мой код:
if (preg_match("/(?i)\b((?:https?:\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))/", "https://google.com/picture.jpeg")) {
echo "A match was found.";
} else {
echo "A match was not found.";
}
Заранее спасибо.
Вы должны использовать одиночные апострофы и избегать одиночных апострофов:
if (preg_match('/(?i)\b((?:https?:\/\/|www\d{0,3}[.]|[a-z0-9.-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'".,<>?«»“”‘’]))/', "https://google.com/picture.jpeg")) {
// ^ ^ ^
echo "A match was found.";
} else {
echo "A match was not found.";
}
Увидеть IDEONE демо
В противном случае вам придется удвоить обратную косую черту, чтобы фактически представить буквальную обратную косую черту. Обратите внимание, что экранировать запятую не обязательно. Вам даже не нужно выходить из дефиса в конечной позиции внутри класса персонажа [a-z0-9.-]
,
Вы ушли без разделителя, то есть через два после https?://
должно быть https?:\/\/
и один здесь [a-z]{2,4}/
должно быть [a-z]{2,4}\/
(?i)\b((?:https?:\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))