Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在正则表达式中包含或排除某些特定模式?_Php_Regex - Fatal编程技术网

Php 如何在正则表达式中包含或排除某些特定模式?

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。 我自己写了这样的东西,一点也不好: (

我正在尝试匹配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:\/\/\;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次之间,尽可能多次,根据需要回馈(贪婪)
      • 或者匹配此选项(如果此选项不匹配,则整个组将失败)
        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+&@#/%=~_|!:,.;]*)?