繁体   English   中英

正则表达式preg_match_all PHP,用于%variable%

[英]Regular Expression preg_match_all PHP for %variable%

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

Lorem ipsum dolor就座,协约%variable1% ,请与临时劳动者和劳动者共同诉讼。 尽量不要抽烟,不要进行任何锻炼,以免造成经济损失%variable2% Duis aute irure dolor in reprehenderit in voltate velit esse cillum dolore eu fugiat nulla pariatur。 Excepteur烧结靶occaecat cupidatat非proident,必须遵守的过失%variable3%魁正式开通了deserunt mollit阿尼姆ID EST laborum。

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

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

有什么建议吗?

像这样

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

演示版

<?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函数。

如果问我这不是一个好主意,因为您可能最终会在25%和35%之类的值之间出现“变量”。 现在,如果您假设变量名不能以空格开头,甚至更好,只能以字母开头,那么您可以使用如下代码:

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

作为正则表达式。

使用“。” 就像别人提到的那样会惹上你的麻烦。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM