如何从preg_match_all正则表达式中的子模式中更正结果?

约翰·波

我有以下代码:

$query = 'CREATE table "msg" ( "myid" INT(10) UNSIGNED , "user" INT(10) UNSIGNED , "new_mes" SMALLINT(5) UNSIGNED , "total_mes" MEDIUMINT(8) UNSIGNED , "lastdate" DATETIME , PRIMARY KEY ("ids"), KEY ("lastdate") )'; 

我正在尝试使用以下子模式获取“主键”和“键”:

preg_match_all('/(?:\WPRIMARY\W*KEY\W?\()(?P<PRIMARY_KEY>[^)]+)|'.
        '(?:\W*KEY\W?\()(?P<KEY>[^)]+)/i',$query,$results);
        $primary_key = isset($results['PRIMARY_KEY'][0]) ? $results['PRIMARY_KEY'][0] : '';
        $key = isset($results['KEY'][0]) ? $results['KEY'][0] : '';
    print_r($results);

我得到以下输出:

Array
(
    [0] => Array
        (
            [0] =>  PRIMARY KEY ("ids"
            [1] => ),KEY ("lastdate"
        )

    [PRIMARY_KEY] => Array
        (
            [0] => "ids"
            [1] => 
        )

    [1] => Array
        (
            [0] => "ids"
            [1] => 
        )

    [KEY] => Array
        (
            [0] => 
            [1] => "lastdate"
        )

    [2] => Array
        (
            [0] => 
            [1] => "lastdate"
        )
)

我寻找了用双引号引起来的单词。结果几乎可以找到,但我希望在第一个索引[0]中获得两个单词“ ids”和“ lastdate”。您能解释一下为什么将第一个单词放在第一个索引中而将第二个单词放在第二个索引中是为什么吗?以及为什么第二个和第一个索引上有空字符串。

有没有办法如何使两个单词都在索引0上?只是为了简化代码。

ou

您可以在右上方的边栏中检查您的正则表达式如何与Regex101一起使用

完成这项工作的另一种方法(请参见在线演示):

<?php
// I added a primary key `myid` to demonstrate a capture with several keywords
$query = 'CREATE table "msg" ( "myid" INT(10) UNSIGNED , "user" INT(10) UNSIGNED , "new_mes" SMALLINT(5) UNSIGNED , "total_mes" MEDIUMINT(8) UNSIGNED , "lastdate" DATETIME , PRIMARY KEY ("ids", "myid"), KEY ("lastdate") )'; 

// 1. Note the \b anchor to ensure that the capture begins at the start of a word
// 2. PREG_SET_ORDER to keep structure simplier
preg_match_all('#\b((?:PRIMARY\s*?)?KEY) \(([^\)]*)\)#i', $query, $results, PREG_SET_ORDER);

$primary_keys = [];
$keys = [];

foreach ($results as $result) {
    $values = explode(',', $result[2]); // get separate words
    array_walk($values, function (&$v) { $v = trim($v, ' "'); }); // remove quotes and spaces
    if (0 === stripos($result[1], 'PRIMARY')) {
        $primary_keys = array_merge($primary_keys, $values);
    }
    else {
        $keys = array_merge($keys, $values);
    }
}

echo "Found primary keys:\n";
print_r($primary_keys);
echo "Found keys:\n";
print_r($keys);

echo "\n\$results:\n";
print_r($results);

结果:

Found primary keys:
Array
(
    [0] => ids
    [1] => myid
)
Found keys:
Array
(
    [0] => lastdate
)

$results:
Array
(
    [0] => Array
        (
            [0] => PRIMARY KEY ("ids", "myid")
            [1] => PRIMARY KEY
            [2] => "ids", "myid"
        )

    [1] => Array
        (
            [0] => KEY ("lastdate")
            [1] => KEY
            [2] => "lastdate"
        )

)

您可以在Regex101上看到,此新版本比旧版本有377步而旧版本904步来捕获结果,效率更高

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何从preg_match_all正则表达式中的子模式中更正结果?

来自分类Dev

正则表达式PHP preg_match_all

来自分类Dev

PHP preg_match_all正则表达式

来自分类Dev

正则表达式,获取子模式

来自分类Dev

JavaScript正则表达式跳过子模式

来自分类Dev

从正则表达式中排除子模式

来自分类Dev

子模式正则表达式

来自分类Dev

preg_match_all PHP的条件正则表达式模式

来自分类Dev

是否可以在正则表达式中命名子模式,然后按C ++中的子模式名称提取匹配项?

来自分类Dev

使用preg_match_all中的php对/数组创建多维递归正则表达式

来自分类Dev

正则表达式-匹配模式,但返回子模式

来自分类Dev

说明此PHP正则表达式的含义(preg_match_all)

来自分类Dev

正则表达式/ preg_match_all与可选匹配

来自分类Dev

PHP的preg_match_all简单的正则表达式返回空值

来自分类Dev

需要正则表达式帮助(preg_match_all)

来自分类Dev

使用正则表达式(preg_match_all)从括号中排除数据

来自分类Dev

网址路由的preg_match_all正则表达式问题

来自分类Dev

php preg_match_all与正则表达式,字符串解析。多行

来自分类Dev

preg_match_all找不到正则表达式的出现

来自分类Dev

正则表达式获取拆分电子邮件部分preg_match_all

来自分类Dev

正则表达式无法正常工作-PHP preg_match_all

来自分类Dev

正则表达式,用于preg_match_all价格

来自分类Dev

从.NET正则表达式对象获取命名组子模式

来自分类Dev

PHP:试图了解子模式正则表达式匹配

来自分类Dev

正则表达式在第一个找到的子模式处停止

来自分类Dev

正则表达式匹配重复的子模式

来自分类Dev

正则表达式赶上最后一个子模式

来自分类Dev

在Python正则表达式中使用排列捕获重复的子模式

来自分类Dev

正则表达式在第一个找到的子模式处停止

Related 相关文章

  1. 1

    如何从preg_match_all正则表达式中的子模式中更正结果?

  2. 2

    正则表达式PHP preg_match_all

  3. 3

    PHP preg_match_all正则表达式

  4. 4

    正则表达式,获取子模式

  5. 5

    JavaScript正则表达式跳过子模式

  6. 6

    从正则表达式中排除子模式

  7. 7

    子模式正则表达式

  8. 8

    preg_match_all PHP的条件正则表达式模式

  9. 9

    是否可以在正则表达式中命名子模式,然后按C ++中的子模式名称提取匹配项?

  10. 10

    使用preg_match_all中的php对/数组创建多维递归正则表达式

  11. 11

    正则表达式-匹配模式,但返回子模式

  12. 12

    说明此PHP正则表达式的含义(preg_match_all)

  13. 13

    正则表达式/ preg_match_all与可选匹配

  14. 14

    PHP的preg_match_all简单的正则表达式返回空值

  15. 15

    需要正则表达式帮助(preg_match_all)

  16. 16

    使用正则表达式(preg_match_all)从括号中排除数据

  17. 17

    网址路由的preg_match_all正则表达式问题

  18. 18

    php preg_match_all与正则表达式,字符串解析。多行

  19. 19

    preg_match_all找不到正则表达式的出现

  20. 20

    正则表达式获取拆分电子邮件部分preg_match_all

  21. 21

    正则表达式无法正常工作-PHP preg_match_all

  22. 22

    正则表达式,用于preg_match_all价格

  23. 23

    从.NET正则表达式对象获取命名组子模式

  24. 24

    PHP:试图了解子模式正则表达式匹配

  25. 25

    正则表达式在第一个找到的子模式处停止

  26. 26

    正则表达式匹配重复的子模式

  27. 27

    正则表达式赶上最后一个子模式

  28. 28

    在Python正则表达式中使用排列捕获重复的子模式

  29. 29

    正则表达式在第一个找到的子模式处停止

热门标签

归档