1

好的,所以我的问题很简单。我希望答案也是。假设我有以下 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],依此类推。然后,它将以字符串(而不是数组)的形式返回“新”内容,以便我可以进一步使用它解析。

我应该如何意识到这一点?

4

4 回答 4

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);
    }
}
于 2013-03-06T15:49:03.020 回答
0

一种方法是循环遍历要替换的数组中的每个元素;myTag用or替换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);
于 2013-03-06T15:54:36.053 回答
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();
于 2013-03-06T16:07:32.813 回答
-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);

但请注意,这些是按顺序运行的,因此如果“PART_ONE”的文本包含随后将被替换的文本“PART_TWO”。

于 2013-03-06T15:45:20.627 回答