搜索包含在###中的所有字符串…#在php中

搜索包含在###中的所有字符串…#在php中,php,regex,Php,Regex,我正在尝试构建一个程序,可以从模板中读取变量,并允许用户编辑它们。我正在尝试使用regex在模板中查找用户定义变量的实例,它看起来像###VARIABLENAME# 基本上,我想将VARIABLENAME部分抓取到一个数组项中,用于源字符串中存在的每个变量 我环顾了一下四周,但什么也找不到,正则表达式语法对于以前从未使用过它的人来说是个怪兽 感谢您的帮助 编辑: 样本输入: "Hello there ##NAME##, you have ##ORDERSNUM## orders pending"

我正在尝试构建一个程序,可以从模板中读取变量,并允许用户编辑它们。我正在尝试使用regex在模板中查找用户定义变量的实例,它看起来像
###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分钟前就该到了。他经常更改接受投票,所以我消除了他对答案接受和向上投票的疑虑
,但是##这个#会#不会#工作##会吗?
这绝对不是一个可变名称。