Php 展平正则表达式数组

Php 展平正则表达式数组,php,arrays,regex,preg-match-all,Php,Arrays,Regex,Preg Match All,我有一个正则表达式数组-$toks: Array ( [0] => /(?=\D*\d)/ [1] => /\b(waiting)\b/i [2] => /^(\w+)/ [3] => /\b(responce)\b/i [4] => /\b(from)\b/i [5] => /\|/ [6] => /\b(to)\b/i ) 当我试图压平它时: $patterns_flattened = imp

我有一个正则表达式数组-$toks:

Array
(
    [0] => /(?=\D*\d)/
    [1] => /\b(waiting)\b/i
    [2] => /^(\w+)/
    [3] => /\b(responce)\b/i
    [4] => /\b(from)\b/i
    [5] => /\|/
    [6] => /\b(to)\b/i
)
当我试图压平它时:

$patterns_flattened = implode('|', $toks); 
我有一个正则表达式:

/(?=\D*\d)/|/\b(waiting)\b/i|/^(\w+)/|/\b(responce)\b/i|/\b(from)\b/i|/\|/|/\b(to)\b/i
当我试图:

if (preg_match('/'. $patterns_flattened .'/', 'I'm waiting for a response from', $matches)) {
    print_r($matches);  
}
  • 我得到一个错误:

    警告:preg_match():第行…index.php中的未知修饰符“(”

我的错在哪里?
谢谢。

您需要删除开头和结尾斜杠,如下所示:

$toks = [
    '(?=\D*\d)',
    '\b(waiting)\b',
    '^(\w+)',
    '\b(response)\b',
    '\b(from)\b',
    '\|',
    '\b(to)\b',
];
然后,我想您应该使用
preg\u match\u all
而不是
preg\u match

$patterns_flattened = implode('|', $toks);
if (preg_match_all("/$patterns_flattened/i", "I'm waiting for a response from", $matches)) {
    print_r($matches[0]);
}
如果您得到第一个元素而不是所有元素,它将返回每个正则表达式的全部匹配项:

Array
(
    [0] => I
    [1] => waiting
    [2] => response
    [3] => from
)

您需要删除开头和结尾斜杠,如下所示:

$toks = [
    '(?=\D*\d)',
    '\b(waiting)\b',
    '^(\w+)',
    '\b(response)\b',
    '\b(from)\b',
    '\|',
    '\b(to)\b',
];
然后,我想您应该使用
preg\u match\u all
而不是
preg\u match

$patterns_flattened = implode('|', $toks);
if (preg_match_all("/$patterns_flattened/i", "I'm waiting for a response from", $matches)) {
    print_r($matches[0]);
}
如果您得到第一个元素而不是所有元素,它将返回每个正则表达式的全部匹配项:

Array
(
    [0] => I
    [1] => waiting
    [2] => response
    [3] => from
)

要对
$tok
阵列进行一些调整

  • 要删除错误,需要从每个数组元素中删除模式分隔符和模式修饰符
  • 捕获分组都不是必需的,事实上,这将导致更高的步数,并创建不必要的输出数组膨胀
  • 无论您对
    (?=\D*\D)
    的意图是什么,都需要重新思考。如果输入字符串中的任何地方都有数字,则可能会生成大量空元素,这肯定不会对您的项目有任何好处。当我在输入字符串中的
    from
    之后加上空格
    1
  • 这是我的建议:()

    输出:


    您需要对
    $tok
    阵列进行一些调整

  • 要删除错误,需要从每个数组元素中删除模式分隔符和模式修饰符
  • 捕获分组都不是必需的,事实上,这将导致更高的步数,并创建不必要的输出数组膨胀
  • 无论您对
    (?=\D*\D)
    的意图是什么,都需要重新思考。如果输入字符串中的任何地方都有数字,则可能会生成大量空元素,这肯定不会对您的项目有任何好处。当我在输入字符串中的
    from
    之后加上空格
    1
  • 这是我的建议:()

    输出:


    正则表达式需要介于//之间,因此需要从数组的每个值中删除//,还需要删除“i”(表示不区分大小写),并将其放在//i之后,数组中的所有数据在/implode()之间内爆/i@user889349为什么不循环数组并测试每个正则表达式?@splash58这会慢得多,IMHObut OP现在应该确保删除诸如
    /i
    之类的选项不会更改正则表达式的逻辑。正则表达式需要介于//之间,因此需要从数组的每个值中删除/,同时删除“i”这意味着不区分大小写,并将其放在//i之后,数组中的所有数据都在/impold()之间内爆/i@user889349为什么不循环数组并测试每个正则表达式?@splash58这会慢得多,IMHObut OP现在应该确保删除诸如
    /i
    之类的选项不会改变正则表达式的逻辑。
    array (
      0 => 'I',
      1 => 'waiting',
      2 => 'response',
      3 => 'from',
    )