Регулярное выражение preg_match_all PHP для% переменной%

Ищем регулярное выражение для preg_match_all, которое может обнаруживать переменную, инкапсулированную в% в теле текста, например:

Lorem ipsum dolor sit amet, conctetur adipisicing %variable1%, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud упражнение ullamco labouris nisi ut aliquip %variable2% ex ea Commodo Conquat. Duis aute irure dolor в репрехендерит в сладострастном velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, загорелся in culpa %variable3% qui officia deserunt mollit anim id est Laborum.

Где определяемые переменные заключены в символы%. Переменные могут включать строчные буквы (a-z), цифры (0-9) и дефис (-). Я хотел бы вернуть имена переменных в знаках% в массиве, как показано ниже, но не могу заставить их соответствовать.

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

Любой совет?


person dpegasusm    schedule 01.02.2014    source источник
comment
Попробуйте /%(.+?)%/, затем уточните.   -  person elclanrs    schedule 01.02.2014
comment
~%([^%]+)%~ более явный   -  person HamZa    schedule 02.02.2014


Ответы (3)


Сделай это так

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

Демо

person Shankar Narayana Damodaran    schedule 01.02.2014

<?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? вы можете загрузить функцию array_column по адресу https://github.com/ramsey/array_column.

person CentaurWarchief    schedule 01.02.2014

Не очень хорошая идея, если вы спросите меня, потому что вы можете в конечном итоге получить «переменные» между такими вещами, как 25% и 35%. Теперь, если вы предполагаете, что имя переменной не может начинаться с пробела или, что еще лучше, может начинаться только с буквы, вы можете использовать что-то вроде этого:

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

как регулярное выражение.

С использованием '.' как и другие, упомянутые выше, доставит вам неприятности.

Обратите внимание, что есть функция preg_replace_callback (), на случай, если вы захотите заменить переменную чем-то другим.

person Alexis Wilke    schedule 01.02.2014