带数组的preg_replace字符串

时间:2013-03-06 15:39:39

标签: php regex parsing

好的,所以我的问题非常简单。我希望答案也是。 假设我有以下php字符串:

<!DOCTYPE html>
<html>
<head>
    <title>test file</title>
</head>
<body>
    <div id="dynamicContent">
        <myTag>PART_ONE</myTag>
        <myTag>PART_TWO </myTag>
        <myTag> PART_THREE</myTag>
        <myTag> PART_FOUR </myTag>
    </div>
</body>
</html>

让我们说这是$ content。 现在,你可以看到我有4个带有一个单词内容的自定义标签(myTag)。 (PART_ONE,PART_TWO等) 我想用4个不同的字符串替换那4个。后4个字符串在数组中:

$replace = array("PartOne", "PartTwo", "PartThree", "PartFour");

我这样做了,但它没有成功:

$content = preg_replace("/<myTag>(.*?)<\/myTag>/s", $replace, $content);

所以,我想搜索myTags(它找到4)并用数组的一个条目替换它。第一次出现应该用$ replace [0]替换,第二次用$ replace [1]替换,等等。 然后,它将“new”内容作为字符串(而不是数组)返回,因此我可以将其用于进一步解析。

我应该如何实现这一点?

4 个答案:

答案 0 :(得分:1)

以下内容应该有效:

$replace = array("PartOne", "PartTwo", "PartThree", "PartFour");
if (preg_match_all("/(<myTag>)(.*?)(<\/myTag>)/s", $content, $matches)) {
    for ($i = 0; $i < count($matches[0]); $i++) {
        $content = str_replace($matches[0][$i], $matches[1][$i] . $replace[$i] . $matches[3][$i], $content);
    }
}

答案 1 :(得分:0)

一种方法是循环遍历要替换的数组中的每个元素;将myTag替换为myDoneTag或其他每个完成的内容,以便找到下一个。然后你总是可以在最后放回myTag,你就有了你的字符串:

for(ii=0; ii<4; ii++) {
    $content = preg_replace("/<myTag>.*<\/myTag>/s", "<myDoneTag>".$replace[ii]."<\/myDoneTag>", $content, 1);
}
$content = preg_replace("/myDoneTag/s", "myTag", $content);

答案 2 :(得分:0)

使用正则表达式,你可以这样:

$replaces = array('foo','bar','foz','bax');
$callback = function($match) use ($replaces) {
        static $counter = 0;
        $return = $replaces[$counter % count($replaces)];
        $counter++;
        return $return;
};
var_dump(preg_replace_callback('/a/',$callback, 'a a a a a '));

但实际上,在html或xml中搜索标签时,您需要一个解析器:

$html = '<!DOCTYPE html>
<html>
<head>
    <title>test file</title>
</head>
<body>
    <div id="dynamicContent">
        <myTag>PART_ONE</myTag>
        <myTag>PART_TWO </myTag>
        <myTag> PART_THREE</myTag>
        <myTag> PART_FOUR </myTag>
    </div>
</body>
</html>';

$d = new DOMDocument();
$d->loadHTML($html);
$counter = 0;
foreach($d->getElementsByTagName('mytag') as $node){
        $node->nodeValue = $replaces[$counter++ % count($replaces)];
}
echo $d->saveHTML();

答案 3 :(得分:-2)

这应该是您正在寻找的语法:

$patterns = array('/PART_ONE/', '/PART_TWO/', '/PART_THREE/', '/PART_FOUR/');
$replaces = array('part one', 'part two', 'part three', 'part four');

preg_replace($patterns, $replaces, $text);

但请注意,这些是按顺序运行的,因此如果&#39; PART_ONE`的文字包含文字&#39; PART_TWO&#39;随后将被替换。