Экранирование запятой

У меня есть это регулярное выражение

(?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.";
}

Заранее спасибо.

0

Решение

Вы должны использовать одиночные апострофы и избегать одиночных апострофов:

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.-],

1

Другие решения

Вы ушли без разделителя, то есть через два после 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`!()\[\]{};:'".,<>?«»“”‘’]))
1

По вопросам рекламы [email protected]