как заменить текст из строки включаемым файлом в php - PullRequest
0 голосов
/ 06 января 2012

Я хочу знать, как заменить некоторый текст в строке php на что-то вроде include или что-то.

Вот мой пример строки: у меня есть строка "bla bla bla bla {{module: projects, id= 1}} бла бла бла бла "

Я хочу найти {{module: projects, id = 1}} и включить в него ('projects.php? Id = 1');прямо в строке.

как бы мне это сделать?

Альтернативой, если бы я мог это сделать, но я не могу заставить его выполнить php из строки, было бы "bla"бла бла бла бла бла "

Ответы [ 4 ]

3 голосов
/ 06 января 2012

с 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);
}
0 голосов
/ 06 января 2012

Вы должны посмотреть, есть ли повторяющийся узор в вашей строке. Есть несколько способов обрезать нить и придать ей другую форму.

Самый простой подход - создать регулярное выражение, а затем использовать это, например. с preg_match

0 голосов
/ 06 января 2012
  • Знаете ли вы, что 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' );
    
0 голосов
/ 06 января 2012

Я думаю, что вы можете достичь этого, используя preg_match, но чтобы избежать головной боли при создании правила, я бы использовал explode(), чтобы вырезать различные части строки.

Вырезать строку вэтот порядок:

  1. explode($string, "{{") и выбор 2-го элемента в массиве ($array[1])

  2. explode($result, "}}") и выбор 1-гоэлемент

  3. explode($result, ":") и извлечение 2-го элемента

  4. explode($result, ",") и извлечение обоих элементов

Тогда вы можете использовать

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

Тогда используйте include($page.$info);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...