正则表达式preg_match_all PHP for%variable%

时间:2014-02-01 03:11:14

标签: php regex preg-match-all

寻找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 repreptderit 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。

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

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

有什么建议吗?

3 个答案:

答案 0 :(得分:0)

这样做

<?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

答案 1 :(得分:0)

<?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%' => 'hello']);
服务器版本小于5.4?您可以在https://github.com/ramsey/array_column下载 array_column 功能。

答案 2 :(得分:0)

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

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

作为正则表达式。

使用'。'像其他提到的那样会让你陷入困境。

请注意,如果您想用其他内容替换变量,也会有preg_replace_callback()函数。