1

$ dataとして提供されているデータがありますが、その例としては...

<div class="widget_output">
<div id="test1">
    Some Content
</div>
    <ul>
        <li>
            <p>
                <div>768hh</div>
                <div>2308d</div>
                <div>237ds</div>
                <div>23ljk</div>
            </p>
       </li>
        <div id="temp3">
            Some more content
        </div>
       <li>
            <p>
                <div>lkgh322</div>
                <div>32khhg</div>
                <div>987dhgk</div>
                <div>23lkjh</div>
            </p>
        </li>
</div>

段落内の無効なHTMLDIVを変更しようとしているので、代わりにこれで終わります...

   <div class="widget_output">
<div id="test1">
    Some Content
</div>
    <ul>
        <li>
            <p>
                <span>768hh</span>
                <span>2308d</span>
                <span>237ds</span>
                <span>23ljk</span>
            </p>
       </li>
        <div id="temp3">
            Some more content
        </div>
       <li>
            <p>
                <span>lkgh322</span>
                <span>32khhg</span>
                <span>987dhgk</span>
                <span>23lkjh</span>
            </p>
        </li>
</div>

私はstr_replaceを次のようなもので使用してこれを行おうとしています...

$data = str_replace('<div>', '<span>', $data);
$data = str_replace('</div>', '</span', $data);

これらの2つのステートメントを組み合わせて、「これはランダムなアイテムです」にのみ影響し、他の発生には影響しないようにする方法はありますか?

4

3 に答える 3

4
$data = str_replace(array('<div>', '</div>'), array('<span>', '</span>'), $data);

あなたが他の詳細を与えず、尋ねただけである限り:

これらの2つのステートメントを組み合わせて、「これはランダムなアイテムです」にのみ影響し、他の発生には影響しないようにする方法はありますか?

どうぞ:

$data = str_replace('<div>This is a random item</div>', '<span>This is a random item</span>', $data);
于 2012-07-29T21:54:23.177 に答える
1

正規表現を使用して目的の処理を行うか、実際に文字列を XML として解析してそのように変更する必要があります。XML 解析は、文字列が有効な XML である限り予測可能な方法で動作するため、ほぼ確実に「最も安全」です。正規表現は、文字列が期待される形式と正確に一致していないことの餌食になることがありますが、入力が十分に予測可能であれば、問題ありません。正規表現でやりたいことをするには、次のようにします

$parsed_string = preg_replace("~<div>(?=This is a random item)(.*?)</div>~", "<span>$1</span>, $input_string);

ここで起こっているのは、<div>(先読みアサーションを使用して) が続くタグを正規表現が探していることThis is a random itemです。次に、そのタグと次の</div>タグの間のテキストをキャプチャします。最後に、一致を に置き換え、その後にタグ<span>内からキャプチャされたテキストが続き、その後に. これは、投稿した例では問題なく機能しますが、たとえば、タグにクラス属性がある場合は問題が発生します。そのようなことが予想される場合は、より複雑な正規表現が必要になるか、完全な XML 解析が最善の方法である可能性があります。div</span><div>

于 2012-07-29T22:20:45.943 に答える
0

他の回答には少し驚いています。誰かが良い回答を投稿すると思っていましたが、そうはなりませんでした。str_replaceこの場合、 は十分に強力ではなく、正規表現は行き当たりばったりなので、パーサーを作成する必要があります。

完全な HTML パーサーを作成する必要はありません。少しごまかすことができます。

$in = '<div class="widget_output">
(..)
</div>';

$lines = explode("\n", $in);

$in_paragraph = false;
foreach ($lines as $nr => $line) {
    if (strstr($line, "<p>")) {
        $in_paragraph = true;
    } else if (strstr($line, "</p>")) {
        $in_paragraph = false;
    } else {
        if ($in_paragraph) {
            $lines[$nr] = str_replace(array('<div>', '</div>'), array('<span>', '</span>'), $line);
        }
    }
}
echo implode("\n", $lines);

ここで重要な部分は、段落にいるかどうかを検出することです。そして、段落にいるときだけ、文字列の置換を行います。

注:\n完全ではない改行()で分割していますが、この場合は機能します。この部分を改善する必要があるかもしれません。

于 2012-07-30T09:58:10.497 に答える