我写了2个功能。第一个是这样的:
function Find($string, $first, $last)
{
$string = " ".$string;
$action = strpos($string,$first);
if ($action == 0) return "";
$action += strlen($first);
$result = strpos($string,$last,$action) - $action;
return substr($string,$action,$result);
}
第二个在这里:
function Replace($string)
{
$find = Find($string, '#*','*#');
return preg_replace('/'.$find.'/', '___', $string);
}
我想替换以#*
开头并以*#
结尾的字符串。以下是我的示例文字:Donec gravida #*c_01*# quam nec pulvinar #*c_02*# facilisis. Donec sed consectetur #*c_03*# lectus.
当我使用这样的函数时:echo Replace($string);
只有第一个字符串替换,其他字符串不替换。像这样:Donec gravida #*___*# quam nec pulvinar #*c_02*# facilisis. Donec sed consectetur #*c_03*# lectus.
答案 0 :(得分:0)
尝试设置preg_replace的限制参数。
preg_replace('/'.$find.'/', '___', $string, 1);
答案 1 :(得分:0)
我认为你想要在一对标记(#*
和*#
)之间提取值,然后将它们格式化为另一种形式:
例如,转换:
Donec gravida #*c_01*# quam nec pulvinar #*c_02*# facilisis.
Donec sed consectetur #*c_03*# lectus
到
Donec gravida link=?c_01 quam nec pulvinar link=?c_02 facilisis.
Donec sed consectetur link=?c_03 lectus
如果是,您可以在正则表达式中使用组捕获:
/(?:#\*)+([^#\*]+)+(?:\*#)/
正则表达式将提取#*
和*#
之间的值。
<?php
$str = 'Donec gravida #*c_01*# quam nec pulvinar #*c_02*# facilisis. Donec sed consectetur #*c_03*# lectus';
$matches = array();
$ptn = '/(?:#\*)+([^#\*]+)+(?:\*#)/';
preg_match_all($ptn, $str, $matches);
var_export($matches);
输出将是:
array (
0 =>
array (
0 => '#*c_01*#',
1 => '#*c_02*#',
2 => '#*c_03*#',
),
1 =>
array (
0 => 'c_01',
1 => 'c_02',
2 => 'c_03',
),
)
$matches[0]
将包含与完整模式匹配的文本,$matches[1]
将包含与第一个捕获的带括号的子模式匹配的文本
所以,只需使用preg_replace()
转换它。
<?php
$str = 'Donec gravida #*c_01*# quam nec pulvinar #*c_02*# facilisis. Donec sed consectetur #*c_03*# lectus';
$matches = array();
$ptn = '/(?:#\*)+([^#\*]+)+(?:\*#)/';
$str = preg_replace($ptn, 'link?=$1', $str);
echo $str, "\n"
输出将是:
Donec gravida link?=c_01 quam nec pulvinar link?=c_02 facilisis.
Donec sed consectetur link?=c_03 lectus
请注意preg_replace
()中的第二个参数,它是$matches[1]
。
答案 2 :(得分:0)
下面是一个很好的可循环使用的功能 - 您只需将一个字符串传递给它就可以“原样”使用它或者您也可以将替换和模式传递给它。
function ReplaceChar($string, $replace = "#*___*#", $pattern = "/\#\*(.*?)\*\#/"){
$new = preg_replace($pattern, $replace, $string);
return $new;
}
$string = "Donec gravida #*___*# quam nec pulvinar #*c_02*# facilisis. Donec sed consectetur #*c_03*# lectus.";
echo ReplaceChar($string);
这将导致:
Donec gravida #*___*# quam nec pulvinar #*___*# facilisis. Donec sed consectetur #*___*# lectus.