【问题标题】:preg_match_all regex with quotespreg_match_all 带引号的正则表达式
【发布时间】:2014-01-09 00:30:08
【问题描述】:

我正在解析一个 php 文件,我想从中获取一个特定的变量值。

说 $str = '$title = "Hello world" ; $author = "极客蝙蝠侠"';

我想在给定变量 $author 的情况下获得“极客蝙蝠侠”。但我想动态地做到这一点。

假设从 html 表单输入值 所以

$myDynamicVar = $_POST['var']; //coming from form in the HTML
//$myDynamicVar = '$title = '; (the user will provide the dollar sign and the equal sign)

$pattern = '/\'. $myDynamicVar . '"(.*?)"/s';
$result = preg_match_all($pattern, $str, $output, PREG_SET_ORDER);

结果是空的,尽管我知道变量存在。 我假设它与双引号有关,我没有正确地转义它们。

有人可以帮忙吗?

【问题讨论】:

  • 这个任务的背景是什么?为什么首先需要它?
  • @zerkms 我想创建一个 GUI 来修改 php 变量(这样没有 php 技能的用户可以更新基于 php 变量生成的网站)
  • 你能加载php文件吗?如果是这样,您可以获得变量的内容为echo $$myDynamicVar
  • @Stephani Alves:那你为什么不修改基于文本的文件,比如.ini?然后在你的 php 代码中阅读它们
  • @StephaniAlves 将这些值存储在数据库或配置文件(可能是 XML?)中并通过 PHP 检索值比直接解析 php 文件应该更容易、更安全(也更正确)

标签: php regex preg-match-all


【解决方案1】:

proper tokenizer 可用时用正则表达式解析 php 代码有点疯狂:

$str = '$title = "Hello world" ; $author="Geek Batman"';

$tokens = token_get_all('<?php ' . $str);

$state = 0;
$result = null;

foreach ($tokens as $token) {
    switch ($state) {
        case 0:
            if ($token[0] == T_VARIABLE && $token[1] == '$author') {
                $state = 1;
            }
            break;

        case 1:
            if ($token[0] == T_CONSTANT_ENCAPSED_STRING) {
                $result = $token[1];
                break 2;
            }
            break;
    }
}

var_dump($result);

演示:http://ideone.com/bcV9ol

【讨论】:

  • 使用分词器非常整洁 :)
  • 感谢您提供出色的解决方案。它为我想要的工作
【解决方案2】:

问题更可能与用户输入的在正则表达式中具有某些含义的特殊字符有关(在您的情况下主要是美元,但也可能是其他字符)。所以你需要对它们进行转义(使用preg_quote),所以正则表达式匹配$,而不是将其解释为end of line

(你用来转义美元的方式不起作用,它是转义引号以关闭字符串,而不是转义变量内容中的美元)

尝试以下方法:

$myDynamicVar = $_POST['var']; //coming from form in the HTML
//$myDynamicVar = '$title = '; (the user will provide the dollar sign and the equal sign)

$pattern = '/'. preg_quote($myDynamicVar) . '"(.*?)"/s';
$result = preg_match_all($pattern, $str, $output, PREG_SET_ORDER);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-24
    • 1970-01-01
    • 2010-09-18
    • 1970-01-01
    • 2022-08-12
    相关资源
    最近更新 更多