我想知道如何用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”
答案 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()
来删除字符串的不同部分。
按此顺序剪切字符串:
explode($string, "{{")
并获取数组中的第二个元素($array[1]
)
explode($result, "}}")
并获取第一个元素
explode($result, ":")
并获取第二个元素
explode($result, ",")
并获取这两个元素
然后你可以使用
$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' );