3

<span>すべてのタグ<p>をphpqueryを使用して置き換えたい。私のコードの何が問題になっていますか?検出されますspanが、replaceWith関数は何も実行していません。

$event = phpQuery::newDocumentHTML(file_get_contents('event.html'));
$formatted_event = $event->find('span')->replaceWith('<p>');

このドキュメントは、これが可能であることを示しています:
http ://code.google.com/p/phpquery/wiki/Manipulation#Replacing
http://api.jquery.com/replaceWith/

->replaceWith('<p></p>')これは、コードの有無にかかわらず返されるhtmlです。

<span class="Subhead1">Event 1<br></span><span class="Subhead2">Event 2<br>
    August 12, 2010<br>
    2:35pm <br>
    Free</span>
4

5 に答える 5

3

プレーンな DOMDocument ソリューション (DOMDocument は phpQuery のフードの下で HTML フラグメントを解析するために使用されます) を気にしない場合は、少し前に似たようなことをしました。必要なことを行うためにコードを調整しました:

$document = new DOMDocument();

// load html from file
$document->loadHTMLFile('event.html');

// find all span elements in document
$spanElements = $document->getElementsByTagname('span');
$spanElementsToReplace = array();

// use temp array to store span elements
// as you cant iterate a NodeList and replace the nodes
foreach($spanElements as $spanElement) {
  $spanElementsToReplace[] = $spanElement;
}

// create a p element, append the children of the span to the p element, 
// replace span element with p element
foreach($spanElementsToReplace as $spanElement) {
    $p = $document->createElement('p');

    foreach($spanElement->childNodes as $child) {
        $p->appendChild($child->cloneNode(true));
    }

    $spanElement->parentNode->replaceChild($p, $spanElement);
} 

// print innerHTML of body element
print DOMinnerHTML($document->getElementsByTagName('body')->item(0));


// --------------------------------


// Utility function to get innerHTML of an element
// -> "stolen" from: http://www.php.net/manual/de/book.dom.php#89718
function DOMinnerHTML($element) {
    $innerHTML = "";
    $children = $element->childNodes;
    foreach ($children as $child)
    {
        $tmp_dom = new DOMDocument();
        $tmp_dom->appendChild($tmp_dom->importNode($child, true));
        $innerHTML.=trim($tmp_dom->saveHTML());
    }
    return $innerHTML;
} 

たぶん、これはphpQueryで置換を行う方法について正しい方向に導くことができますか?


編集:

私はreplaceWithのjQueryドキュメントを提供しました別の見方をすると、新しい、置き換えられたコンテンツにしたいhtmlフラグメント全体を渡す必要があるように思えます。

切り取られたこのコードは私のために働いた:

$event = phpQuery::newDocumentHTML(...);

// iterate over the spans
foreach($event->find('span') as $span) {
// make $span a phpQuery object, otherwise its just a DOMElement object
$span = pq($span);
// fetch the innerHTMLL of the span, and replace the span with <p>
$span->replaceWith('<p>' . $span->html() . '</p>');
}

print (string) $event;

1 行でチェーンされたメソッド呼び出しでこれを行う方法を見つけることができませんでした。

于 2010-08-29T18:02:29.203 に答える
1

試す;

$formatted_event = $event->find('span')->replaceWith('<p></p>');
于 2010-08-29T07:49:10.933 に答える
1

これでより良いstr_replace仕事をしませんか?より速く、より簡単にデバッグできます。外部ライブラリにはバグがある可能性があることを常に考慮してください:)

$htmlContent = str_replace("<span", "<p", $htmlContent);
$htmlContent = str_replace("</span>", "</p>", $htmlContent);    
于 2010-08-29T09:55:21.677 に答える
0

実際にラップ機能を使用できます

$event = phpQuery::newDocumentHTML(...);

// iterate over the spans
foreach($event->find('span') as $span) {
  // make $span a phpQuery object, otherwise its just a DOMElement object
  $span = pq($span);
  // wrap the span with <p>
  $span->wrap('<p></p>');
}

print (string) $event;
于 2011-10-20T12:20:19.577 に答える
0

試しましたか:

 $formatted_event = $event->find('span')->replaceWith('p');
于 2010-08-29T08:03:30.677 に答える