如何将多个正则表达式转换为一个正则表达式

时间:2014-04-25 20:06:43

标签: php regex

嗨我在1中有3个正则表达式preg_match ...

我想知道是否可以将1个正则表达式混合在一起?

这是我的3个正则表达式:

if(!preg_match("#\s#",$file) && !preg_match("#\.\.\/#",$file) && (preg_match_all("#/#",$file,$match)==1)):

(我想:没有“空格”,没有“../”,只有1“/”)

感谢您的帮助。

修改

在列表中添加所需内容(更易读):

  • no“space”
  • no“../”
  • 1“/”

4 个答案:

答案 0 :(得分:3)

您可以使用:

if (preg_match('~^(?!.*?(?: |\.\./))(?!(.*?/){2}).*$~', $file) {
  ...
}

Working Demo

答案 1 :(得分:3)

这很简单。让我们一步一步地制作这个正则表达式:

  1. 首先,让我们使用锚来定义字符串的开始和结束:^$
  2. I want: no "space",我们有\S与非空白字符匹配:^\S+$
  3. no "../",让我们添加一个负向前瞻^(?!.*[.][.]/)\S+$,请注意我们不需要转义字符类中的点。至于转发,我们将使用不同的分隔符
  4. one optional "/",我们可以添加一个负面的预测,以防止2个前进^(?!(?:.*/){2})(?!.*[.][.]/)\S+$
  5. 让我们定义分隔符并添加s修饰符以匹配换行符.~^(?!(?:.*/){2})(?!.*[.][.]/)\S+$~s,然后使用 online demo < / LI>

答案 2 :(得分:2)

为什么不这样:

if (preg_match('~((?>[^\s/.]++|\.(?!\./))*)/?(?1)\z~A', $str))
    echo 'OK';

细节:

~
(                   # capture group 1
    (?>
        [^\s./]++   # all that is not a space, a dot or a slash
      |             # OR
        \.(?!\./)   # a dot not followed by another dot and a slash
    )*
)                  
/?                  # optional /
(?1)                # repeat the capture group 1
\z                  # anchor for end of the string
~A                  # anchored pattern

注意:如果要排除空字符串,有两种可能:

if (preg_match('~(?=.)((?>[^\s/.]++|\.(?!\./))*)/?(?1)\z~A', $str))

if (preg_match('~((?>[^\s/.]++|\.(?!\./))*)/?(?1)\z~A', $str, $m) && $m)

答案 3 :(得分:1)

你不能合并三者,因为你有一个match_all。

我会用substr_count替换preg_match_all,因为pattern是静态的,所以它应该更快。

if(!preg_match("#\s|\.\./#",$file) && (substr_count($file,'/')<=1))

编辑:替换== 1由&lt; = 1表示/是可选的

Edit2:我们不会因为合并两个负面模式而失去太多的可读性