custom str_replace = find(same value) 并替换为数组
custom str_replace = find(same value) and replace with array
我想知道是否可以创建我自己的 str_replace,以填充空白,请参见下面的示例:
$words = array('cat','mole');
$find='[blank]';
$string ="Lorem ipsum -[blank]- sit amet, consectetur
adipiscing elit. Donec condimentum augue
sit amet blandit vehicula. Nullam placerat
aliquam dictum. Quisque elementum nisl
sed pellentesque elementum. Aliquam erat
volutpat. Suspendisse potenti. Maecenas [blank]."
echo str_replace ($find,$words,$string);
预期的输出是这样的:
Lorem ipsum -cat- sit amet, consectetur
adipiscing elit. Donec condimentum augue
sit amet blandit vehicula. Nullam placerat
aliquam dictum. Quisque elementum nisl
sed pellentesque elementum. Aliquam erat
volutpat. Suspendisse potenti. Maecenas mole.
谢谢
编辑:如果我能改进这个问题我会很难解释所以我举了一个例子。
简介
一个超级简单的方法就是遍历数组并设置 preg_replace
只替换 1 个项目(而不是每个匹配项)。另一种方法使用字符串函数在 $haystack
中查找 $needle
的位置,改编自 this answer.
代码
以下两种方法都假定 $haystack
是输入。下面的示例输入(从 OP 的问题中复制):
$haystack = <<<DOC
Lorem ipsum -[blank]- sit amet, consectetur
adipiscing elit. Donec condimentum augue
sit amet blandit vehicula. Nullam placerat
aliquam dictum. Quisque elementum nisl
sed pellentesque elementum. Aliquam erat
volutpat. Suspendisse potenti. Maecenas [blank].
DOC;
使用正则表达式
如果您的 $needle
是 未知 ,因为它可能包含特殊的正则表达式字符,您可以使用 preg_quote
来转义这些特殊字符(正如 musashii 在我的回答下方的评论中指出的那样)。
$array = ['cat', 'mole'];
$re = '/\[blank\]/';
foreach($array as $replacement) {
$text = preg_replace($re, $replacement, $haystack, 1);
}
echo $haystack;
使用字符串函数
$array = ['cat', 'mole'];
$needle = '[blank]';
foreach($array as $replacement) {
$pos = strpos($haystack, $needle);
if ($pos !== false) {
$haystack = substr_replace($haystack, $replacement, $pos, strlen($needle));
}
}
echo $haystack;
另一种可能是使用 preg_replace_callback
和闭包:
$cnt = 0;
$regex = '~\Q[blank]\E~';
$string = preg_replace_callback(
$regex,
function($match) use ($cnt, $words) {
global $cnt;
if (array_key_exists($cnt, $words)) {
$cnt++;
return $words[$cnt-1];
} else {
return '';
}
},
$string);
echo $string;
这会产生
Lorem ipsum -cat- sit amet, consectetur
adipiscing elit. Donec condimentum augue
sit amet blandit vehicula. Nullam placerat
aliquam dictum. Quisque elementum nisl
sed pellentesque elementum. Aliquam erat
volutpat. Suspendisse potenti. Maecenas mole.
思路是增加一个计数器$cnt
和return数组$words
.
的值
正则表达式
~\Q[blank]\E~
就是不转义[blank]
的意思
我想知道是否可以创建我自己的 str_replace,以填充空白,请参见下面的示例:
$words = array('cat','mole');
$find='[blank]';
$string ="Lorem ipsum -[blank]- sit amet, consectetur
adipiscing elit. Donec condimentum augue
sit amet blandit vehicula. Nullam placerat
aliquam dictum. Quisque elementum nisl
sed pellentesque elementum. Aliquam erat
volutpat. Suspendisse potenti. Maecenas [blank]."
echo str_replace ($find,$words,$string);
预期的输出是这样的:
Lorem ipsum -cat- sit amet, consectetur
adipiscing elit. Donec condimentum augue
sit amet blandit vehicula. Nullam placerat
aliquam dictum. Quisque elementum nisl
sed pellentesque elementum. Aliquam erat
volutpat. Suspendisse potenti. Maecenas mole.
谢谢
编辑:如果我能改进这个问题我会很难解释所以我举了一个例子。
简介
一个超级简单的方法就是遍历数组并设置 preg_replace
只替换 1 个项目(而不是每个匹配项)。另一种方法使用字符串函数在 $haystack
中查找 $needle
的位置,改编自 this answer.
代码
以下两种方法都假定 $haystack
是输入。下面的示例输入(从 OP 的问题中复制):
$haystack = <<<DOC
Lorem ipsum -[blank]- sit amet, consectetur
adipiscing elit. Donec condimentum augue
sit amet blandit vehicula. Nullam placerat
aliquam dictum. Quisque elementum nisl
sed pellentesque elementum. Aliquam erat
volutpat. Suspendisse potenti. Maecenas [blank].
DOC;
使用正则表达式
如果您的 $needle
是 未知 ,因为它可能包含特殊的正则表达式字符,您可以使用 preg_quote
来转义这些特殊字符(正如 musashii 在我的回答下方的评论中指出的那样)。
$array = ['cat', 'mole'];
$re = '/\[blank\]/';
foreach($array as $replacement) {
$text = preg_replace($re, $replacement, $haystack, 1);
}
echo $haystack;
使用字符串函数
$array = ['cat', 'mole'];
$needle = '[blank]';
foreach($array as $replacement) {
$pos = strpos($haystack, $needle);
if ($pos !== false) {
$haystack = substr_replace($haystack, $replacement, $pos, strlen($needle));
}
}
echo $haystack;
另一种可能是使用 preg_replace_callback
和闭包:
$cnt = 0;
$regex = '~\Q[blank]\E~';
$string = preg_replace_callback(
$regex,
function($match) use ($cnt, $words) {
global $cnt;
if (array_key_exists($cnt, $words)) {
$cnt++;
return $words[$cnt-1];
} else {
return '';
}
},
$string);
echo $string;
这会产生
Lorem ipsum -cat- sit amet, consectetur
adipiscing elit. Donec condimentum augue
sit amet blandit vehicula. Nullam placerat
aliquam dictum. Quisque elementum nisl
sed pellentesque elementum. Aliquam erat
volutpat. Suspendisse potenti. Maecenas mole.
思路是增加一个计数器
$cnt
和return数组$words
.的值 正则表达式
~\Q[blank]\E~
就是不转义[blank]
的意思