Php 如何在正则表达式中包含或排除某些特定模式?
我正在尝试匹配URL的某些部分。首先,我只想找到这样的匹配项:Php 如何在正则表达式中包含或排除某些特定模式?,php,regex,Php,Regex,我正在尝试匹配URL的某些部分。首先,我只想找到这样的匹配项: http://Stackoverflow.com/questions/blah/balh.blah http://www.stackoverflow.com/questions/blah/balh.blah stackoverflow.com/questions/blah/balh.blah www.stackoverflow.com/ 但是我想使用其他协议,比如https和ftp。 我自己写了这样的东西,一点也不好: (
http://Stackoverflow.com/questions/blah/balh.blah
http://www.stackoverflow.com/questions/blah/balh.blah
stackoverflow.com/questions/blah/balh.blah
www.stackoverflow.com/
但是我想使用其他协议,比如https
和ftp
。
我自己写了这样的东西,一点也不好:
((http:\/\/\;https:\/\/\;ftp:\/\/)*)((www.)*)([a-z]+)([a-z]{2,3})(\/)*
这个正则表达式有很多问题,我需要弄清楚如何修复它。首先,我如何指定例如只有
http
或https
有效,而不是htttp
或hazzzt
等
更准确地说:
(http)
并不像单词一样,它只是一组字符,所以任何只有其中一个字母的单词都会得到匹配。
我读过关于作为单词边界的\b
,但它似乎并不意味着将\bhttp\b
视为单个单词而不是一组字符
对于www
部分,匹配wwww
和ww
或任何其他数量的w
s!
我总是得到一个匹配,无论我输入什么!
我用来测试正则表达式 也许您可以使用PHP过滤器功能
if (filter_var($url, FILTER_VALIDATE_URL) !== false)
FILTER_VALIDATE_URL根据RFC 2396验证URL
不要认为你需要外圆括号,例如下面的括号是为了匹配http://或www。(确保你逃过了句号) 另外,若您使用的是preg_match,那个么apache.htaccess for jnstance和您使用的字符表示模式的开始和结束,就像#
侯赛因,你的问题中有几个要点和问题 A.如何在正则表达式中包含或排除某些特定模式? 有很多技巧。对于简单模式,可以使用负字符类或负查找来指定所需内容,也可以指定不需要的内容。对于更复杂的模式,一个很好的起点是 B.如何包含或排除特定单词? 通常,为了确保特定单词属于或不属于字符串,如果您不知道其位置,请在字符串开头进行前瞻(或负前瞻):
^(?=.*?MyWord) # makes sure the word is there
或
C.现在很清楚的一点是,(http)并没有被当作一个单词来对待,它只是一组字符,所以任何只有其中一个字母的单词都会得到匹配
这是不对的<代码>(http)将只匹配http
。例如,它将不匹配ptth
。也许您正在考虑[http]
,这将是一个字符类,允许字符h、t和p只匹配一次(而且效率很低,因为[pth]
就可以了)
D.如何匹配URL的各个部分
对此有很多解决方案,但今天我建议不要重新发明轮子。为此,我可以推荐RegexBuddy库中的regex吗?是的
(?i)\b((?#protocol)https?|ftp)://((?#domain)[-A-Z0-9.]+)((?#file)/[-A-Z0-9+&@#/%=~_|!:,.;]*)?((?#parameters)\?[A-Z0-9+&@#/%=~_|!:,.;]*)?
下面是一个令牌对令牌的解释(我在开头添加了不区分大小写的(?I)
修饰符)
- 在单词边界处断言位置(位置前面或后面,但不能同时有Unicode字母、数字或下划线)
\b
- 匹配下面的正则表达式,并将其匹配捕获到backreference number 1
((?#协议)https?| ftp)
- 匹配此备选方案(仅当此备选方案失败时才尝试下一个备选方案)
(?#协议)https?
- 注释:协议
(?#协议)
- 按字面意思匹配字符串“http”(不区分大小写)
http
- 按字面意思匹配字符“s”(不区分大小写)
s?
- 在0到1次之间,尽可能多次,根据需要回馈(贪婪)
?
- 在0到1次之间,尽可能多次,根据需要回馈(贪婪)
- 注释:协议
- 或者匹配此选项(如果此选项不匹配,则整个组将失败)
ftp
- 按字面意思匹配字符串“ftp”(不区分大小写)
ftp
- 按字面意思匹配字符串“ftp”(不区分大小写)
- 匹配此备选方案(仅当此备选方案失败时才尝试下一个备选方案)
- 匹配字符串“://”字面上的
://
- 匹配下面的正则表达式,并将其匹配捕获到backreference number 2
((?#domain)[-A-Z0-9.]+)
- 注释:域
(?#域)
- 匹配下面列表中的单个字符
[-a-Z0-9.]+
- 在一次和无限次之间,尽可能多次,根据需要回馈(贪婪)
+
- 文字字符“-”
-
- 介于“A”和“Z”之间的字符(不区分大小写)
A-Z
- 介于“0”和“9”之间的字符
0-9
- 文字字符“.”
- 在一次和无限次之间,尽可能多次,根据需要回馈(贪婪)
- 注释:域
- 匹配下面的正则表达式,并将其匹配捕获到反向引用编号3
((?#文件)/[-A-Z0-9+&@#/%=~ |!:,.;]*)?
- 在0到1次之间,尽可能多次,根据需要回馈(贪婪)
?
- 注释:文件
(?#文件)
- 按字面意思匹配字符“/”
/
- 匹配下面列表中的单个字符
[-a-Z0-9+&@#/%=~ |!:,.;]*
- 在零次和无限次之间,尽可能多次,根据需要回馈(贪婪)
*
- 文字字符“-”
-
- 介于“A”和“Z”之间的字符(不区分大小写)
A-Z
- 介于“0”和“9”之间的字符
^(?=.*?MyWord) # makes sure the word is there
^(?!.*?MyWord) # makes sure the word is not there
(?i)\b((?#protocol)https?|ftp)://((?#domain)[-A-Z0-9.]+)((?#file)/[-A-Z0-9+&@#/%=~_|!:,.;]*)?((?#parameters)\?[A-Z0-9+&@#/%=~_|!:,.;]*)?
- 在零次和无限次之间,尽可能多次,根据需要回馈(贪婪)
- 在0到1次之间,尽可能多次,根据需要回馈(贪婪)