【问题标题】:Regular Expression preg_match_all PHP for %variable%%variable% 的正则表达式 preg_match_all PHP
【发布时间】:2014-02-24 22:49:21
【问题描述】:

寻找preg_match_all 的正则表达式,它可以检测封装在文本正文中的 % 中的变量,如下所示:

Lorem ipsum dolor sit amet,consectetur adipisicing %variable1%,sed do eiusmod tempor incididunt ut labore et dolore magna aliqua。 Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip %variable2% ex ea commodo consequat。 Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur。 Exceptioneur sint occaecat cupidatat non proident, sunt in culpa %variable3% qui officia deserunt mollit anim id est laborum。

其中要检测的变量被封装在 % 符号中。变量可以包括小写字母 (a-z)、数字 (0-9) 和连字符 (-)。我想在数组中返回 % 符号中的变量名称,如下所示,但无法匹配。

Array (
    [0] => 'variable1',
    [1] => 'variable2',
    [3] => 'variable3'
}

有什么建议吗?

【问题讨论】:

  • 尝试/%(.+?)%/,然后进行优化。
  • ~%([^%]+)%~ 更明确

标签: php regex preg-match-all


【解决方案1】:

这样做

<?php
$txt='Lorem ipsum dolor sit amet, consectetur adipisicing %variable1%, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip %variable2% ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa %variable3% qui officia deserunt mollit anim id est laborum.';
preg_match_all('/%(.*?)%/', $txt, $matches);
print_r($matches[1]);

OUTPUT :

Array
(
    [0] => variable1
    [1] => variable2
    [2] => variable3
)

Demo

【讨论】:

    【解决方案2】:
    <?php
    
    $text = <<<TEXT
    Lorem ipsum dolor sit amet, consectetur adipisicing %variable1%, sed do eiusmod tempor incididunt 
    ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco 
    laboris nisi ut aliquip %variable2% ex ea commodo consequat. Duis aute irure dolor in reprehenderit 
    in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat
    non proident, sunt in culpa %variable3% qui officia deserunt mollit anim id est laborum.
    TEXT;
    
    preg_match_all('/%(?P<variables>.*?)%/', $text, $matches);
    print_r($matches['variables']);
    

    将输出:

    Array
    (
        [0] => variable1
        [1] => variable2
        [2] => variable3
    )
    

    奖金

    function process ($text, array $variables) {
      preg_match_all('/(?P<variables>%(.*?)%)/', $text, $matches, PREG_OFFSET_CAPTURE);
      if (isset($matches['variables'])) {
        foreach (array_column($matches['variables'], 0, 1) AS $offset => $var) {
          $value = isset($variables[$var]) ? $variables[$var] : NULL;
          $text = substr_replace($text, $value, $offset, strlen($var));
        }
    
        return $text;
      }
    
      // whoopz!
      return NULL;
    }
    

    使用它 (PHP 5.4+) echo process($text, ['%variable1%' =&gt; 'hello']);
    服务器版本低于 5.4 ?你可以在https://github.com/ramsey/array_column下载array_column函数。

    【讨论】:

      【解决方案3】:

      如果您问我,这不是一个好主意,因为您最终可能会得到介于 25% 和 35% 之间的“变量”。现在,如果您假设变量名不能以空格开头,或者更好的是,只能以字母开头,那么您可以使用以下内容:

      '/%([a-zA-Z][a-zA-Z0-9_]*?)%/'
      

      作为正则表达式。

      使用“。”像其他人提到的那样会给你带来麻烦。

      请注意,还有一个 preg_replace_callback() 函数,以防您想用其他东西替换变量。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-12
        • 2016-08-08
        • 1970-01-01
        相关资源
        最近更新 更多