转义逗号

Escaping a comma

我有这个正则表达式

(?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 demo

否则,您必须将反斜杠加倍才能真正表示文字反斜杠。请注意,根本不需要转义逗号。您甚至不必转义字符 class [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`!()\[\]{};:'".,<>?«»“”‘’]))