【问题标题】:Regex should not match if detects one or more space characters如果检测到一个或多个空格字符,则正则表达式不应匹配
【发布时间】:2013-03-28 09:36:16
【问题描述】:

我的用户输入链接结构:

++visible part of link====invisible HTML address part of link++

输入字符串:

some text here some text here ++stack overflow====http://stackoverflow.com/questions/ask++ some text here ++examplesite.com====http://www.examplesite.com/article?id=1++ some text here some text here some text here some text here ++shouldnotmatch.com====http://w ww.shouldnotmatch.com/++ some text here.

我的目标:

如果====++ 之间的部分包含一个或多个空格字符,则preg_match_all 不应匹配。所以我想要的输出是与前两次链接尝试相匹配。但最后一次链接尝试不应匹配,因为 w ww 包含一个空格字符。

我的失败尝试:

  1. \+\+(.+?)====(.+?[^ ])\+\+
  2. \+\+(.+?)====(.+?[^ {1, }])\+\+

你能纠正我吗?

【问题讨论】:

    标签: php regex preg-match-all


    【解决方案1】:

    第一次尝试时,您在空格验证之前允许所有字符。

    这样的东西有用吗?

    !\+\+(.+?)====([^ ]+?)\+\+!
    

    如果括号之间总是有一些东西,那么你可以去掉?

    !\+\+(.+?)====([^ ]+)\+\+!
    

    【讨论】:

    • 您的第一个提案有效,我将使用。我不会使用第二个,因为用户可能会忘记输入 smthng btw paranthesis。谢谢(将在 6 分钟后接受)
    【解决方案2】:

    试试这个正则表达式:

    [+]{2}(.+?)[=]{4}([^\s]+?)[+]{2}
    

    【讨论】:

    • 一个小的改进是将+? 替换为*,因为如果我是对的,它们的含义是一样的......我是对的吗?
    • 不,你不是,量词(+或*)后的问号(?)使它变得不贪婪(懒惰),见regular-expressions.info/repeat.html
    • @Yazmat 谢谢。这也有效。所以2个答案的结构非常不同。我无法解释 Yazmat 的那个,所以问我应该使用哪一个?
    • \s 支持空格、制表符和换行符(以防您激活多行)。 {} 之间的数字是量词(而不是重复例如 = 四次 (====) ,您只需使用 ={4}
    • 如果你想了解更多关于正则表达式的世界,我会推荐你​​这个链接:regular-expressions.info/tutorial.html
    猜你喜欢
    • 2013-12-16
    • 1970-01-01
    • 1970-01-01
    • 2014-04-16
    • 2019-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多