寻找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'
}
有什么建议吗?
答案 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
)
答案 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()函数。