查找所有与preg_匹配的PHP变量

查找所有与preg_匹配的PHP变量,php,regex,preg-match,Php,Regex,Preg Match,如何找到所有具有preg\u match的PHP变量。我创建了以下正则表达式: $string = 'Hallo $var. blabla $var, $iam a var $varvarvar gfg djf jdfgjh fd $variable'; $instring = array(); preg_match_all('/\$(.*?)/', $string, $instring); print_r($instring); 我只是不明白正则表达式是如何工作的 \$(.*?) 不是与P

如何找到所有具有
preg\u match
的PHP变量。我创建了以下正则表达式:

$string = 'Hallo $var. blabla $var, $iam a var $varvarvar gfg djf jdfgjh fd $variable';
$instring = array();
preg_match_all('/\$(.*?)/', $string, $instring);
print_r($instring);
我只是不明白正则表达式是如何工作的

\$(.*?)
不是与PHP变量名匹配的正确正则表达式。此类和给定为(不带前导美元符号):

因此,在您的情况下,我会尝试:

\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)
而不是:

如果您想了解PHP中正则表达式的工作原理,您需要阅读PHP手册以及所用正则表达式方言(PCRE)手册中的内容。还有一本叫做《掌握正则表达式》的好书,我可以推荐阅读

另见:


    • 非常感谢您的回答,这对我帮助很大

      下面是正则表达式的详细版本,将查找扩展到数组变量,至少使用数字索引和前面的逻辑求反:

      function get_variables_from_expression($exp){
          $pattern = '/((!\$|\$)[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*[0-9\[\]]*)/';
          $result = preg_match_all($pattern,$exp,$matches);
          return($matches[0]);
      }
      
      $example = '(($aC[5][7][1]xor((((!$a[5]&&!$a[4])&&!$a[3])&&!$a[2])&&$aC[6][6][0]))xor$aC[6][6][2])';
      $list = get_variables_from_expression($example);
      
      foreach($list as $var){
          echo "$var<br>";
      }
      
      要查找所有变量(包括数组变量),可以使用regex(perl):

      \$([a-zA-Z\ux7f-\xff]*)\[([a-zA-Z]{1}[a-zA-Z0-9{1,32})\]

      然后,如果要替换它们(包括单引号),请将它们替换为:

      \$$1['$2']

      感谢您的回答。我将其与一些其他变量相结合,以匹配PHP数组变量和面向对象变量:

      \$(([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*(->)*)*(\[[^\]]*\])*)
      
      $this->that
      $this["sure"]["thing"][0]
      $var
      $_GET["id"]
      
      应与以下变量匹配:

      \$(([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*(->)*)*(\[[^\]]*\])*)
      
      $this->that
      $this["sure"]["thing"][0]
      $var
      $_GET["id"]
      

      这将适用于
      regex
      ,但不适用于
      PHP
      。示例:
      $%#
      将被加上标题-但它不是有效的php变量。您可以限制为字母数字的
      $([\w\d]+)
      -但是
      ${'foo'}
      检查将失败。结论-尝试使用语法解析是个坏主意regex@AlmaDo Mundo:“感谢”这里的非贪婪匹配,零字符匹配的星号重复已经做到了。这个糟糕的想法是值得的,我也可以把这个角度放在我的答案中,并可能提供一个链接。我也能做到。只需通过
      T_VARIABLE
      过滤结果,感谢您的快速响应,我想了解正则表达式是如何工作的,再次感谢您为我指引了正确的方向。顺便说一句,你的解决方案是有效的。@sirwilliam:我还美化了演示示例,使其成为答案的一部分。正如你所看到的,它是链接的,所以你可以用它来学习PCRE的工作原理:)玩也是一种很好的学习方式。我知道,用php玩一整天。雷塞格在我的脑子里是一个无人居住的地方。我将尝试探索它。这与有效变量
      $var
      不匹配,但与无效变量
      $[ab]
      \$(([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*(->)*)*(\[[^\]]*\])*)
      
      $this->that
      $this["sure"]["thing"][0]
      $var
      $_GET["id"]