Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP:查找模式中的所有引用,并用不同的值替换每个引用_Php_Regex - Fatal编程技术网

PHP:查找模式中的所有引用,并用不同的值替换每个引用

PHP:查找模式中的所有引用,并用不同的值替换每个引用,php,regex,Php,Regex,我有一个字符串是这样的: Hello my name is [foo], I'm from [foo] 然后我声明一个数组: $foo = array('Sam', 'Tunisia'); 如何在文本中找到所有出现的[foo],并将第一个替换为$foo[0],第二个替换为$foo[1]。。。结果应该是这样的: Hello my name is Sam, I'm from Tunisia PS:我必须使用@Rizer123建议的相同模式[foo],使用。例如: <?php $st

我有一个字符串是这样的:

Hello my name is [foo], I'm from [foo] 
然后我声明一个数组:

$foo = array('Sam', 'Tunisia');
如何在文本中找到所有出现的[foo],并将第一个替换为$foo[0],第二个替换为$foo[1]。。。结果应该是这样的:

 Hello my name is Sam, I'm from Tunisia

PS:我必须使用@Rizer123建议的相同模式[foo]

,使用。例如:

<?php

$str = "Hello my name is [foo], I'm from [foo]";
$foo = ['Sam', 'Tunisia'];

// note: passing `$foo` by reference. This allows you to
// unshift entries for each match. If there are more matches
// in `$str` than elements in the `$foo` array, `array_shift()`
// will simply return `null`

echo preg_replace_callback('/\[foo\]/', function() use (&$foo) {
    return array_shift($foo);
}, $str);

按照@Rizer123的建议,使用。例如:

<?php

$str = "Hello my name is [foo], I'm from [foo]";
$foo = ['Sam', 'Tunisia'];

// note: passing `$foo` by reference. This allows you to
// unshift entries for each match. If there are more matches
// in `$str` than elements in the `$foo` array, `array_shift()`
// will simply return `null`

echo preg_replace_callback('/\[foo\]/', function() use (&$foo) {
    return array_shift($foo);
}, $str);

看看
preg\u replace\u callback()
试试看。看看
preg\u replace\u callback()
试试看。有趣的是,这里有一个可笑的一行代码做了同样的事情:
echo内爆('',数组映射(函数($a,$b){return a.$b;},explode('[foo],“你好,我的名字是[foo],我来自[foo])”,好主意,但事实上我有不止一种模式,必须用数据库中的一些数据来替换它们,所以我当然必须使用preg_replace_callback()。我从来不会推荐这个,我只是在这里有点乐趣:)你能告诉我如何使用这个不区分大小写的模式吗?我累了“/\b[foo\b]/i'但它不起作用我不知道为什么要在这里添加
\b
(单词边界)锚点,因为它不是必需的。但是,更重要的是,你没有逃逸开括号和闭括号-因此你用
[foo\b]的“字符类”定义了正则表达式
。要搜索被实际的开括号和闭括号字符包围的foo,你需要对它们进行转义,比如:
\[foo\]
。一旦你这样做了,你可以按照你的例子添加不区分大小写的标志:
/\[foo\]/i
为了好玩,这里有一个可笑的单行程序做同样的事情:
echo introde('',array\u map(函数($a,$b){return$a.$b;},explode('[foo]',“你好,我叫[foo],我来自[foo]”,['Sam',突尼斯']);
;)好主意,但事实上我有不止一个模式,必须用数据库中的一些数据替换它们,所以我必须使用preg_replace_callback()当然。我从来不会在主要答案中推荐这个,我只是在这里有点乐趣:)你能告诉我如何使用这个不区分大小写吗?我厌倦了“/\b[foo\b]/I”,但它不起作用我不知道你为什么添加
\b
(单词边界)锚定在这里,因为它不是必需的。但是,更重要的是,您没有转义开括号和闭括号-因此您使用
[foo\b]
的“字符类”定义了正则表达式。要搜索被实际的开括号和闭括号字符包围的foo,您需要转义它们-例如:
\[foo\]
。完成此操作后,可以根据示例添加不区分大小写的标志:
/\[foo\]/i