preg_replace仅作用于第一场比赛

时间:2014-01-05 12:45:54

标签: php preg-replace

我写了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.

你可以帮帮我吗?我该如何管理?

3 个答案:

答案 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.