echo CDom::fromString($html)->text() . "\n"; // --- Use CDom to work with simple BBCode $bbMarkup = <<<'TXT' [quote] [b]Bold [u]Underline[/u][/b] [i]Italic [/quote] [img width=12 height=16]url[/img] TXT; CDom::$bracketOpen = '['; CDom::$bracketClose = ']'; CDom::$blockTags = array('quote' => true); CDom::$inlineTags = array('b' => true, 'i' => true, 'u' => true); CDom::$selfClosingTags = array(); // Create DOM from string $dom = CDom::fromString($bbMarkup); // Find [b] $b = $dom->find('b'); $expected = '[b]Bold [u]Underline[/u][/b]'; echo $b->outerHtml() . "\n"; // Output: [b]Bold [u]Underline[/u][/b] // Change [img] width $img = $dom->lastChild; $img->width = 450; echo $img->outerHtml() . "\n"; // Output: [img width="450" height="16"]url[/img] // Convert [b] to html CDom::$bracketOpen = '<'; CDom::$bracketClose = '>'; echo $b->outerHtml() . "\n"; // Output: <b>Bold <u>Underline</u></b>
/** * Tests traversing * * @covers CDomList * @covers CDomNode * @covers CDomNodesList */ function testTraversing() { $dom = CDom::fromString($this->test_html2); // --- $l = $dom->find('body')->find('li:eq(1)')->andSelf(); $this->assertEquals(2, $l->length); $i = 0; $el = $l->get($i++); $this->assertEquals('li2', $el->id); $el = $l->get($i); $this->assertEquals('body', $el->name); // --- $l = $dom->find('*')->first(); $this->assertEquals(1, $l->length); $this->assertEquals('html', $l->name); /** @noinspection PhpUndefinedMethodInspection */ $l->end()->last(); $this->assertEquals(1, $l->length); $this->assertEquals('h6', $l->name); /** @noinspection PhpUndefinedMethodInspection */ $l->end()->slice(-2); $this->assertEquals(2, $l->length); $i = 0; $el = $l->get($i++); $this->assertEquals('h1', $el->name); $el = $l->get($i); $this->assertEquals('h6', $el->name); /** @noinspection PhpUndefinedMethodInspection */ $l->end()->slice(3, 3); $this->assertEquals(3, $l->length); $i = 0; $el = $l->get($i++); $this->assertEquals('title', $el->name); $el = $l->get($i++); $this->assertEquals('body', $el->name); $el = $l->get($i); $this->assertEquals('div', $el->name); $list = $dom->find('list'); /** @noinspection PhpUndefinedMethodInspection */ $index = $l->end()->index($list); $this->assertEquals(7, $index); /** @var $res CDomNodesList */ $res = $l->eq(7); $this->assertEquals($list->uniqId, $res->uniqId); /** @noinspection PhpUndefinedMethodInspection */ $res = $l->end()->eq(-11); $this->assertEquals($list->uniqId, $res->uniqId); /** @noinspection PhpUndefinedMethodInspection */ $index = $l->end()->index(new CDomNodeText()); $this->assertEquals(-1, $index); // --- $el = $list->get(0); $res = $el->has('li'); $this->assertTrue($res); $res = $el->has('p'); $this->assertFalse($res); /** @var $li CDomNodeTag */ $li = $el->firstChild; $res = $li->has('*'); $this->assertFalse($res); // Not $list2 = $dom('li')->not('#li2'); $this->assertEquals(3, $list2->length); $i = 0; $el = $list2->get($i++); $this->assertEquals('li1', $el->attr('id')); $el = $list2->get($i++); $this->assertEquals('li3', $el->attr('id')); $el = $list2->get($i); $this->assertEquals('li4', $el->attr('id')); // Is $list2 = $dom('li'); $this->assertTrue($list2->is('li')); $this->assertTrue($list2->is('#li4')); $this->assertFalse($list2->is('div')); // Contents $list2 = $dom->find('list')->contents(); $this->assertEquals(9, $list2->length); foreach ($list2 as $i => $n) { if ($i & 1) { $this->assertTrue($n instanceof CDomNodeTag); } else { $this->assertTrue($n instanceof CDomNodeText); } } // Children $list2 = $list->get(0)->children(); $this->assertEquals(4, $list2->length); $i = 0; $el = $list2->get($i++); $this->assertEquals('li1', $el->attr('id')); $el = $list2->get($i++); $this->assertEquals('li2', $el->attr('id')); $el = $list2->get($i++); $this->assertEquals('li3', $el->attr('id')); $el = $list2->get($i); $this->assertEquals('li4', $el->attr('id')); $list2 = $list->first->children('#li2,#li4'); $this->assertEquals(2, $list2->length); $i = 0; $el = $list2->get($i++); $this->assertEquals('li2', $el->attr('id')); $el = $list2->get($i); $this->assertEquals('li4', $el->attr('id')); $list2 = $list->children(':not(#li3)'); $this->assertEquals(3, $list2->length); $i = 0; $el = $list2->get($i++); $this->assertEquals('li1', $el->attr('id')); $el = $list2->get($i++); $this->assertEquals('li2', $el->attr('id')); $el = $list2->get($i); $this->assertEquals('li4', $el->attr('id')); $list->end(); // Parent $list2 = $dom->find('li:eq(0),title'); $list2->parent(); $this->assertEquals(2, $list2->length); $list2->end(); $list2->parent('head'); $this->assertEquals(1, $list2->length); // Parents $list2 = $li->parents(); $this->assertEquals(4, $list2->length); $this->assertEquals($list2->length, count($list2->list)); $this->assertEquals($list2->length, count($list2->listByIds)); $i = 0; $el = $list2->get($i++); $this->assertEquals('list', $el->name); $el = $list2->get($i++); $this->assertEquals('div', $el->name); $el = $list2->get($i++); $this->assertEquals('body', $el->name); $el = $list2->get($i); $this->assertEquals('html', $el->name); $list2 = $li->parents('html,div'); $this->assertEquals(2, $list2->length); $i = 0; $el = $list2->get($i++); $this->assertEquals('div', $el->name); $el = $list2->get($i); $this->assertEquals('html', $el->name); $list2 = $li->parents(':not(html,div)'); $this->assertEquals(2, $list2->length); $i = 0; $el = $list2->get($i++); $this->assertEquals('list', $el->name); $el = $list2->get($i); $this->assertEquals('body', $el->name); $list2 = $li->parentsUntil('div'); $this->assertEquals(1, $list2->length); $i = 0; $el = $list2->get($i); $this->assertEquals('list', $el->name); $list2 = $dom->find('li:eq(0),p:eq(1)'); $list2->parents(); $this->assertEquals(4, $list2->length); /** @noinspection PhpUndefinedMethodInspection */ $list2->end()->parents('body'); $this->assertEquals(1, $list2->length); // parentsUntil $list2 = $li->parentsUntil('html'); $this->assertEquals(3, $list2->length); $i = 0; $el = $list2->get($i++); $this->assertEquals('list', $el->name); $el = $list2->get($i++); $this->assertEquals('div', $el->name); $el = $list2->get($i); $this->assertEquals('body', $el->name); $list2 = $li->parentsUntil('list'); $this->assertEquals(0, $list2->length); $list2 = $dom->find('li:eq(0),p:eq(1)'); $list2->parentsUntil('body'); $this->assertEquals(2, $list2->length); // closest $el = $li->closest('div'); $this->assertEquals('div', $el->name); $el = $li->closest('html'); $this->assertEquals('html', $el->name); $el = $li->closest('list,body'); $this->assertEquals('list', $el->name); $el = $li->closest('p'); $this->assertEmpty($el); $el = $dom->find('p:eq(1)')->closest('body'); $this->assertEquals('body', $el->name); $list2 = new CDomNodesList(); $this->assertEmpty($list2->closest('*')); // next $list2 = $dom->find('li:eq(0),p:eq(1)'); $list2->getNext(); $this->assertEquals(2, $list2->length); $i = 0; $el = $list2->get($i++); $this->assertEquals('li2', $el->attr('id')); $el = $list2->get($i); $this->assertEquals('p3', $el->attr('id')); /** @noinspection PhpUndefinedMethodInspection */ $list2->end()->getNext('p'); $this->assertEquals(1, $list2->length); $el = $list2->get(0); $this->assertEquals('p3', $el->attr('id')); // nextAll $list2 = $li->nextAll(); $this->assertEquals(3, $list2->length); foreach ($list2 as $el) { $this->assertEquals('li', $el->name); } $i = 0; $el = $list2->get($i++); $this->assertEquals('li2', $el->attr('id')); $el = $list2->get($i++); $this->assertEquals('li3', $el->attr('id')); $el = $list2->get($i); $this->assertEquals('li4', $el->attr('id')); $list2 = $li->nextAll('#li3'); $this->assertEquals(1, $list2->length); $el = $list2->get(0); $this->assertEquals('li3', $el->attr('id')); $list2 = $dom->find('li:eq(1),p:eq(2)'); $list2->nextAll(); $this->assertEquals(4, $list2->length); $i = 1; $el = $list2->get($i++); $this->assertEquals('li4', $el->id); $el = $list2->get($i++); $this->assertEquals('h1', $el->name); $el = $list2->get($i); $this->assertEquals('h6', $el->name); /** @noinspection PhpUndefinedMethodInspection */ $list2->end()->nextAll(':header'); $this->assertEquals(2, $list2->length); $i = 0; $el = $list2->get($i++); $this->assertEquals('h1', $el->name); $el = $list2->get($i); $this->assertEquals('h6', $el->name); // nextUntil $list2 = $li->nextUntil('#li4'); $this->assertEquals(2, $list2->length); $i = 0; $el = $list2->get($i++); $this->assertEquals('li2', $el->attr('id')); $el = $list2->get($i); $this->assertEquals('li3', $el->attr('id')); $list2 = $li->nextUntil('#li2'); $this->assertEquals(0, $list2->length); $list2 = $dom->find('li:eq(1),p:eq(2)')->nextUntil(':header'); $this->assertEquals(2, $list2->length); // prev $list2 = $dom->find('li:eq(1),p:eq(2)'); $list2->getPrev(); $this->assertEquals(2, $list2->length); $i = 0; $el = $list2->get($i++); $this->assertEquals('li1', $el->attr('id')); $el = $list2->get($i); $this->assertEquals('p2', $el->attr('id')); /** @noinspection PhpUndefinedMethodInspection */ $list2->end()->getPrev('p'); $this->assertEquals(1, $list2->length); $el = $list2->get(0); $this->assertEquals('p2', $el->attr('id')); // prevAll $li3 = $li->next->next; $list2 = $li3->prevAll(); $this->assertEquals(2, $list2->length); $i = 0; $el = $list2->get($i++); $this->assertEquals('li2', $el->attr('id')); $el = $list2->get($i); $this->assertEquals('li1', $el->attr('id')); $list2 = $li3->prevAll('#li1'); $this->assertEquals(1, $list2->length); $el = $list2->get(0); $this->assertEquals('li1', $el->attr('id')); $list2 = $dom->find('li:eq(1),p:eq(2)'); $list2->prevAll(); $this->assertEquals(6, $list2->length); $i = 0; $el = $list2->get($i++); $this->assertEquals('li', $el->name); $el = $list2->get($i++); $this->assertEquals('p', $el->name); $el = $list2->get($i++); $this->assertEquals('p', $el->name); $el = $list2->get($i++); $this->assertEquals('hr', $el->name); $el = $list2->get($i++); $this->assertEquals('list', $el->name); $el = $list2->get($i); $this->assertEquals('br', $el->name); /** @noinspection PhpUndefinedMethodInspection */ $list2->end()->prevAll('list'); $this->assertEquals(1, $list2->length); $el = $list2->get(0); $this->assertEquals('list', $el->name); // prevUntil $list2 = $li3->prevUntil('#li1'); $this->assertEquals(1, $list2->length); $el = $list2->get(0); $this->assertEquals('li2', $el->attr('id')); $list2 = $li3->prevUntil('#li2'); $this->assertEquals(0, $list2->length); $list2 = $dom->find('li:eq(1),p:eq(2)')->prevUntil('hr'); $this->assertEquals(3, $list2->length); // siblings $list2 = $li3->siblings(); $this->assertEquals(3, $list2->length); $i = 0; $el = $list2->get($i++); $this->assertEquals('li2', $el->attr('id')); $el = $list2->get($i++); $this->assertEquals('li1', $el->attr('id')); $el = $list2->get($i); $this->assertEquals('li4', $el->attr('id')); $list2 = $dom->find('li:eq(1),p:eq(2)')->siblings(); $this->assertEquals(10, $list2->length); /** @noinspection PhpUndefinedMethodInspection */ $list2->end()->siblings(':not(p)'); $this->assertEquals(8, $list2->length); $dom->clear(); }
/** * Prepares content, for manipulation. * * @param string|CDomNode|CDomNode[]|CDomDocument|CDomNodesList $content * * @return CDomNodesList|false returns FALSE if content is empty */ protected function prepareContent($content) { if (!$content instanceof CDomNodesList) { // Document if ($content instanceof CDomDocument) { $content =& $content->detachChildren(); } else { if (!is_object($content) && !is_array($content)) { $content = CDom::fromString($content); $content =& $content->detachChildren(); } } $list = new self(); $list->add($content); $content = $list; } return $content->length ? $content : false; }