1

PHP変数にhtmlページをロードし、str_replaceを使用して特定の単語を他の単語に変更しています。唯一の問題は、これらの単語の1つが重要なコードに含まれている場合、すべてがビットになってしまうことです。

str_replace関数を特定のhtmlタグにのみ適用する方法はありますか?特に:p、h1、h2、h3、h4、h5

編集:

重要なコード:

 $yay = str_ireplace($find, $replace , $html); 

よろしくお願いします。

編集-さらなる説明:

$findと$replaceは、それぞれ検索および置換される単語を含む配列です。$ htmlは、すべてのhtmlコードを含む文字列です。

それがビットに落ちる良い例は、たとえばドメイン名で発生した単語を見つけて置き換える場合です。したがって、「帽子」という単語を「チーズ」に置き換えたい場合。次のような絶対パスの発生

www.worldofhat.com/images/monkey.jpgは次のように置き換えられます:www.worldofcheese.com/images/monkey.jpg

したがって、置換が特定のタグでのみ発生する可能性がある場合は、これを回避できます。

4

1 に答える 1

2

HTMLドキュメントを単なる文字列として扱わないでください。すでにお気づきのように、タグ/要素(およびそれらがどのようにネストされているか)はHTMLページで意味を持っているため、HTMLドキュメントの作成方法を知っているツールを使用する必要があります。これはDOMになります。

これが例です。最初に使用するHTML

$html = <<< HTML
<body>
    <h1>Germany reached the semi finals!!!</h1>
    <h2>Germany reached the semi finals!!!</h2>
    <h3>Germany reached the semi finals!!!</h3>
    <h4>Germany reached the semi finals!!!</h4>
    <h5>Germany reached the semi finals!!!</h5>
    <p>Fans in Germany are totally excited over their team's 4:0 win today</p>
</body>
HTML;

そして、これがアルゼンチンを幸せにするために必要な実際のコードです

$dom = new DOMDocument;
$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
$nodes = $xpath->query('//*[self::h1 or self::h2 or self::p]');
foreach( $nodes as $node ) {
    $node->nodeValue = str_replace('Germany', 'Argentina', $node->nodeValue);
}
echo $dom->saveHTML();

XPathクエリ呼び出しでコンテンツを置き換えるタグを追加するだけです。XPathを使用する代わりに、JavaScriptから知っているDOMDocument::getElementsByTagNameを使用することもできます。

 $nodes = $dom->getElementsByTagName('h1');

実際、JavaScriptからそれを知っている場合、 DOMは実際にはW3Cによって定義され、多くの言語で実装されている言語に依存しないAPIであるため、さらに多くのことを知っているかもしれません。XPathの利点は、getElementsByTagName明らかに、一度に複数のノードにクエリを実行できることです。欠点は、XPathを知っている必要があることです:)

于 2010-07-03T19:05:08.670 に答える