搜索包含在###中的所有字符串…#在php中
我正在尝试构建一个程序,可以从模板中读取变量,并允许用户编辑它们。我正在尝试使用regex在模板中查找用户定义变量的实例,它看起来像搜索包含在###中的所有字符串…#在php中,php,regex,Php,Regex,我正在尝试构建一个程序,可以从模板中读取变量,并允许用户编辑它们。我正在尝试使用regex在模板中查找用户定义变量的实例,它看起来像###VARIABLENAME# 基本上,我想将VARIABLENAME部分抓取到一个数组项中,用于源字符串中存在的每个变量 我环顾了一下四周,但什么也找不到,正则表达式语法对于以前从未使用过它的人来说是个怪兽 感谢您的帮助 编辑: 样本输入: "Hello there ##NAME##, you have ##ORDERSNUM## orders pending"
###VARIABLENAME#
基本上,我想将VARIABLENAME
部分抓取到一个数组项中,用于源字符串中存在的每个变量
我环顾了一下四周,但什么也找不到,正则表达式语法对于以前从未使用过它的人来说是个怪兽
感谢您的帮助
编辑:
样本输入:
"Hello there ##NAME##, you have ##ORDERSNUM## orders pending".
预期产出:
array[0] = 'NAME'
array[1] = 'ORDERSNUM'
我已经试过了
preg_match("/#(.*)#/", $temphtml, $tempvars)
但这只是返回找到的第一个匹配项,两次。我们用
/###([^#]*)##/
只需使用正则表达式,如:
preg_match_all('/##([^#]+)##/', $string, $matches)
class YourTemplateEngine
{
/**
* Set you html content which has all the tags inside
* @param string $content
*/
public function setContent($content)
{
$this->content = $content;
}
/**
* Set your tags and assign values
* @param string $tag
* @param sting | int |number $value
*/
public function setTagValue($tag, $value)
{
$this->tags_array[$tag] = $value;
}
/**
* Replace all tags
*/
private function replace_tags()
{
$tags = array();
$values = array();
foreach ($this->tags_array as $tag => $val) {
array_push($tags, '##'.$tag.'##');
array_push($values, $val);
}
return str_ireplace($tags, $values, $this->content);
}
/**
* Replace all tags and get output
*/
public function render()
{
return $this->replace_tags();
}
}
请参见自PHP 5.6以来,可以这样做:
$parts = explode('##', $tpl);
array_pop($parts);
$result = array_values(array_filter($parts, function($v,$k) {
return ($k&1 && !empty($v));}, ARRAY_FILTER_USE_BOTH));
您应该使用以下正则表达式:
##(.*?)##
##([^#]*)##
*?
使搜索变慢,因此在第一次###
之后,它将搜索,直到找到另一个###
,然后停止
仅获取
##
如果您查看on,您将看到$matches[1]
在1st
捕获组中存储了一个数据数组。因此,在字符串上:
Hello there ##NAME##, you have ##ORDERSNUM## orders pending
存储在名称
存储在ordersum
如果使用此正则表达式:
##(.*?)##
##([^#]*)##
在但是###这个#将#不#工作###它将
,但是这不可能是一个变量名<代码>;)代码>您可以使用
然后你就可以这样做了
$template = new YourTemplateEngine();
$template->setTagValue('NAME','Your Name');
$template->setTagValue('ORDERSNUM',100);
$template->setContent("Hello there ##NAME##, you have ##ORDERSNUM## orders pending");
print $template->render();
// Outputs
// Hello there Your Name, you have 100 orders pending
显示输入字符串和预期的OUYPUTTAN,您还没有尝试处理beast?太好了,这非常有效,谢谢!有没有办法只包括包装在##内的内容?由于目前的返回包括每个查找的“###VAR##”和“VAR”版本。使用preg#u match_all的默认行为时,(不设置可选的$flags参数),您应该可以找到在$matching数组的第二个元素中收集的键,即$matching[1]。这非常有效,谢谢!正如在另一个答案中提到的,有没有办法只包含包装在##中的内容?因为目前返回的每个查找都包含“##VAR###”和“VAR”两个版本。@Arcadiax:不要将upvote与answer accept混淆:P您切换answer accept的次数太多了。哈哈,我以为您可以选择多个答案,因为您都给出了很好的答案,所以我想选择两者。我的堆栈noobiness显示:P@Arcadiax:这就是为什么有“向上投票”按钮。为了证明你支持一个答案。@Druzion:如果我必须请求投票,我会直接请求。你15分钟前就该到了。他经常更改接受投票,所以我消除了他对答案接受和向上投票的疑虑
,但是##这个#会#不会#工作##会吗?
这绝对不是一个可变名称。