根据散布在整个字符串中的封闭标记,从字符串创建一个数组

时间:2013-09-14 17:12:38

标签: php regex string

我有一个字符串:

  

{ListingAgent First Name}

     

我已附上您的商家信息,{Property Address}。

和数组:

$listingAgent['fname'] = 'Bob';
$property['address'] = '123 street';

不知何故,我需要用$listingAgent['fname']的值替换{ListingAgent First Name} 和{Prperty Address},其值为$property['address']

我需要一种方法来浏览字符串并查找所有{ListingAgent文本}并根据'text'替换它。它几乎就像一个关键值对。

我尝试了以下但是它只回应了第一个,我想我可能会咆哮错误的树

function getbetween($content,$start,$end) {
    $r = explode($start, $content);
    foreach ($r as $key => $val){
        echo $key.'='.$val.'<br/>';
    }
}

$text = $coverletter['cover_text'];
$start = '{';
$end = '}';
echo getbetween($text,$start,$end);

这给了我:

0 = 1 = ListingAgent名称}

  

我附上2 =物业地址}的报价。

     

可以通过4 = Agent Phone}或电话联系我的座席,3 =座席名称}   5 =代理商电子邮件}。

     

我期待与你达成这项协议。

     

6 =买方名字} 7 =买方姓氏}

2 个答案:

答案 0 :(得分:1)

有很多方法可以做到这一点......首先,我假设你从数据库中获取信息,所以你可能会更好地考虑使用JOIN和创建一个数组,而不是有两个单独的数组。

方法

手动设置

如果您的复杂键不遵循相同的模式(由下面的自动方法假设),您可以创建位置持有者和替换的索引数组,然后遍历该批次查找并替换所有相关数据。

$listingAgent['fname'] = 'Bob';        //Example array
$property['address']   = '123 Strret'; //Example array

$replacements = array(
    'ListingAgent First Name' => $listingAgent['fname'],
    'Property Address'        => $property['address']
    );

foreach($replacements as $positionHolder=>$replacementText){
    $string = str_replace("{{$positionHolder}}", $replacementText, $string);
}
echo $string;

自动

如果不知道所有keys的格式/值,而是从显示的内容中进行推断,则无法创建完全自动化的功能:

$listingAgent['fname'] => {ListingAgent First Name}
$property['address'] => {Property Address}

例如,假设Buyer Last Name看起来像:

$buyers['blastname'] => {Buyers Buyer Last Name}

您可以使用以下功能:

$listingAgent['fname'] = 'Bob';        //Example array
$buyers['blastname']   = 'Jones';      //Example array
$property['address']   = '123 Strret'; //Example array


function replaceStrings($matches){
    global $property;
    global $listingAgent;
    global $buyers; //Add in all relevant arrays as globals

    $matches[1][0] = strtolower($matches[1][0]);
    $matches[2]    = explode(' ', trim(strtolower($matches[2])));

    if(count($matches[2]) > 1){
        $matches[2][0] = $matches[2][0][0];
    }

    $matches[2] = implode($matches[2]);

    return ${$matches[1]}[$matches[2]];
}

$string = preg_replace_callback('/\{([^ ]+)([^}]*)\}/', 'replaceStrings', $string);

echo $string;

使用JOIN创建一个数组

如果您从数据库获取数据并决定使用JOIN,则可以将代码更新为:

$string = "
    {fname}
    I have attached an offer for your listing, {address}.
    ";

$replacementArray = array(
    'fname'    => 'Bob',
    'address'  => '123 Street',
    );

foreach($replacementArray as $positionHolder=>$replacementText){
    $string = str_replace("{{$positionHolder}}", $replacementText, $string);
}
echo $string;

在这种情况下,您显然必须在预定义文本中更新占位符,如$string所示。

您也可以在不使用连接的情况下执行此操作,只需将其他阵列合并在一起即可轻松完成!

输出

给出输入:

$string = "{ListingAgent First Name} I have attached an offer for your listing {Buyers Buyers Last Name}, {Property Address}.";

以上三种方法(他们称之为echo $string)的输出都是相同的:

Bob I have attached an offer for your listing, 123 Street. 

答案 1 :(得分:0)

您可以使用str_replace功能将令牌替换为实际值。

例如:

$text = $coverletter['cover_text'];
$text = str_replace("{ListingAgent First Name}", $listingAgent['fname'], $text);
$text = str_replace("{Prperty Address}", $property['address'], $text);