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 だとしましょう。これで、1 つの単語の内容を持つ 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 つ見つかります)、配列の 1 つのエントリに置き換えます。最初のオカレンスは $replace[0] で置き換え、2 番目は $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

正規表現を使用すると、次のようなことができます。

$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 に答える
0

1 つの方法は、置換する配列内の各要素をループすることです。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);
于 2013-03-06T15:54:36.053 に答える
-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 に答える