如何用php中的包含文件替换字符串中的文本

时间:2012-01-06 17:58:21

标签: php string replace

我想知道如何用include或者其他东西替换php字符串中的一些文本。

这是我的示例字符串:我有一个字符串“bla bla bla bla {{module:projects,id = 1}} bla bla bla bla”

我想找{{module:projects,id = 1}}并将其包含在内('projects.php?id = 1');正好在字符串中。

我该如何解决这个问题?

另一种选择,如果我能做到这一点,但我不能让它从字符串执行PHP将是“bla bla bla bla bla bla”

4 个答案:

答案 0 :(得分:3)

使用preg_replace:

$string = '{{ module:projects,id=1 }}';
$string = preg_replace('/{{ module:([^,]+),id=([0-9]+) }}/', 'include(\'$1.php?id=$2\')', $string);
// $string == include('projects.php?id=1')

注意:您实际上不能在末尾包含带有查询字符串的文件。 PHP查找名为'projects.php?id = 1'的文件。

获取文件并实际包含它:

preg_match_all('/{{ module:([^,]+),id=([0-9]+) }}/', $string, $matches);
foreach ($matches[1] as $key => $filename) {
    // set $id before including the file. you could optionally set $_GET['id'].
    $id = $matches[2][$key];
    include($filename . '.php');
}

支持多个参数。与Matmarbon类似,但更紧凑,不假设参数值符合\ w,不会转义值,但间距变化的空间也较小(/ s *)。

preg_match_all('/{{ module:([^,]+)((,[^=]+=[^,}]+)*) }}/', $string, $matches);
foreach ($matches[1] as $key => $filename) {
    foreach (explode(',', trim($matches[2][$key], ', ')) as $vars) {
        list($k, $v) = explode('=', $vars);
        $_GET[$k] = $v;
    }
    // then this:
    include($filename . '.php');
    // or, to replace content:
    ob_start();
    include($filename . '.php');
    $contents = ob_get_contents();
    ob_end_clean();
    $string = str_replace($matches[0][$key], $contents, $string);
}

答案 1 :(得分:0)

我认为您可以使用preg_match实现这一目标,但为了避免创建规则的麻烦,我会使用explode()来删除字符串的不同部分。

按此顺序剪切字符串:

  1. explode($string, "{{")并获取数组中的第二个元素($array[1]

  2. explode($result, "}}")并获取第一个元素

  3. explode($result, ":")并获取第二个元素

  4. explode($result, ",")并获取这两个元素

  5. 然后你可以使用

    $page = $result[0] . '.php';
    $info = $result[1];
    

    然后使用include($page.$info);

答案 2 :(得分:0)

如果字符串中有重复的图案,你必须查看。 有几种方法可以切断你的琴弦并将其换成另一种形状。

最干净的方法是创建正则表达式,然后使用例如preg_match

答案 3 :(得分:0)

  • 您是否知道include('projects.php?id=1');将包含名为projects.php?id=1而非projects.php的文件? 要包含projects.php并将$_GET['id']设置为1,请执行以下操作:

    $_GET['id'] = 1;
    include( 'projects.php' );
    
  • 你应该看看preg_replace。一个例子(假设你知道你在做什么参数):

    echo preg_replace( '/\\{\\{\\s*module:(\w+)(,(\w+=\w+))?\\s*\\}\\}/',
            'include(\'\\1?\\3\');',
            'bla bla bla bla {{ module:projects,id=1 }} bla bla bla bla' );
    

    否则,如果我对你的参数和其他参数的假设在这里是正确的我的解决方案:

    function replace_modules( $var ){
        $stringparams = array_filter( explode( ',', substr( $var[2], 1 ) ) );
        $getparams = array();
        foreach($stringparams as $stringparam){
            list( $key, $value ) = explode( '=', $stringparam );
            $getparams[] = sprintf('$_GET[\'%s\']=\'%s\';',
                addslashes( $key ),
                addslashes( $value ) );
        }
        return sprintf( '<?php %sinclude(\'%s\') ?>',
            implode( $getparams ), addslashes($var[1]) );
    }
    
    $a= preg_replace_callback( '/\\{\\{\\s*module:(\w+)((,\w+=\w+)*)\\s*\\}\\}/',
        'replace_modules',
        'bla bla bla bla {{ module:projects,id=1,test=hello }} bla bla bla bla' );
    

    编辑: 好的,现在我想我知道你想要什么;这是:

    function replace_modules( $var ){
        $stringparams = array_filter( explode( ',', substr( $var[2], 1 ) ) );
        foreach( $stringparams as $stringparam ){
            list( $key, $value ) = explode( '=', $stringparam );
            $_GET[$key] = $value;
        }
        ob_start();
        include( $var[1].'.php' );
        return ob_end_clean();
    }
    
    $a= preg_replace_callback( '/{{\\s*module:([^,]+)((,[^,=]+=[^,]*)*)\\s*}}/',
        'replace_modules',
        'bla bla bla bla {{ module:projects,id=1,test=hello }} bla bla bla bla' );