Обработка html на серверной стороне с помощью phpquery

PHP Введение XML Parser

Функции XML позволяют анализировать, но не проверять XML документы.


XML — это формат данных для стандартизированного структурированного обмена документами. Более подробную информацию о XML можно найти в нашем разделе XML Учебник.

Это расширение использует синтаксический анализатор XML Expat.

Expat — это парсер на основе событий, он рассматривает XML документ как серию событий. Когда происходит событие, оно вызывает определенную функцию для его обработки.

Экспат — это не проверка парсера, и игнорирует любые DTD, связанные с документом. Однако если документ плохо сформирован, он закончится сообщением об ошибке.

Поскольку это основанный на событиях, не проверяющий парсер, Expat быстр и хорошо подходит для веб приложений.

Функции синтаксического анализатора XML позволяет создавать XML парсеров и определить обработчики событий для XML.

How to use

What will the parser return?

  • Each key/value pair from the iCal file will be parsed creating an associative array for both the calendar and every event it contains.

  • Also injected will be content under and for accessing start and end dates with time zone data applied.

  • ️Note the parser is limited to relative date formats which can inhibit how complex recurrence rule parts are processed (e.g. BYDAY combined with BYSETPOS)

    // Dump the whole calendar
    var_dump($ical->cal);
    
    // Dump every event
    var_dump($ical->events());
  • Also included are special arrays which further resolve the contents of a key/value pair.

    // Dump a parsed event's start date
    var_dump($event->dtstart_array);
    
    // array (size=4)
    //   0 =>
    //     array (size=1)
    //       'TZID' => string 'America/Detroit' (length=15)
    //   1 => string '20160409T090000' (length=15)
    //   2 => int 1460192400
    //   3 => string 'TZID=America/Detroit:20160409T090000' (length=36)

Основы работы с phpQuery

Работа с phpQuery происходит подобно jQuery (те же методы). Впрочем, даже не зная jQuery вам будет легко разобраться (или же просто возьмите мои заготовки кода и используйте их, особо не вникая).

Итак, начало работы с библиотекой начинается с phpQuery::newDocument($str), где переменная $str — это HTML код для разбора. В результате вернется объект, к которому мы сможем применять определенные методы:

Итак, в переменной $pq лежит объект. У этого объекта есть метод find, который параметром принимает CSS селектор, а делает следующее: ищет внутри HTML кода из $pq элементы подпадающие под этот селектор. Пример:

Сейчас в переменной $elem лежит объект с найденным дивом #elem. У этого объекта есть метод html, который выводит текст найденного элемента (в нашем случае текст дива #elem):

Кроме метода html есть еще метод text, который делает почти то же самое. Разница: если внутри нашего дива были бы другие теги — метод html вернул бы его текст вместе с этими тегами, а метод text — без них (как будто бы строку обработали функцией strip_tags).

Usage

Straightforward:

require_once 'vendor/autoload.php';
use UAParser\Parser;

$ua = "Mozilla/5.0 (Macintosh; Intel Ma...";

$parser = Parser::create();
$result = $parser->parse($ua);

print $result->ua->family;            // Safari
print $result->ua->major;             // 6
print $result->ua->minor;             // 0
print $result->ua->patch;             // 2
print $result->ua->toString();        // Safari 6.0.2
print $result->ua->toVersion();       // 6.0.2

print $result->os->family;            // Mac OS X
print $result->os->major;             // 10
print $result->os->minor;             // 7
print $result->os->patch;             // 5
print $result->os->patchMinor;        // 
print $result->os->toString();        // Mac OS X 10.7.5
print $result->os->toVersion();       // 10.7.5

print $result->device->family;        // Other

print $result->toString();            // Safari 6.0.2/Mac OS X 10.7.5
print $result->originalUserAgent;     // Mozilla/5.0 (Macintosh; Intel Ma...

Native XML Extensions

I prefer using one of the native XML extensions since they come bundled with PHP, are usually faster than all the 3rd party libs and give me all the control I need over the markup.

DOM

DOM is capable of parsing and modifying real world (broken) HTML and it can do XPath queries. It is based on libxml.

It takes some time to get productive with DOM, but that time is well worth it IMO. Since DOM is a language-agnostic interface, you’ll find implementations in many languages, so if you need to change your programming language, chances are you will already know how to use that language’s DOM API then.

A basic usage example can be found in and a general conceptual overview can be found at

How to use the DOM extension has been covered extensively on StackOverflow, so if you choose to use it, you can be sure most of the issues you run into can be solved by searching/browsing Stack Overflow.

XMLReader

XMLReader, like DOM, is based on libxml. I am not aware of how to trigger the HTML Parser Module, so chances are using XMLReader for parsing broken HTML might be less robust than using DOM where you can explicitly tell it to use libxml’s HTML Parser Module.

A basic usage example can be found at

XML Parser

The XML Parser library is also based on libxml, and implements a SAX style XML push parser. It may be a better choice for memory management than DOM or SimpleXML, but will be more difficult to work with than the pull parser implemented by XMLReader.

SimpleXml


SimpleXML is an option when you know the HTML is valid XHTML. If you need to parse broken HTML, don’t even consider SimpleXml because it will choke.

A basic usage example can be found at A simple program to CRUD node and node values of xml file and there is lots of additional examples in the PHP Manual.

PHP XML Парсер константы

Констант
XML_ERROR_NONE (целое число)
XML_ERROR_NO_MEMORY (целое число)
XML_ERROR_SYNTAX (целое число)
XML_ERROR_NO_ELEMENTS (целое число)
XML_ERROR_INVALID_TOKEN (целое число)
XML_ERROR_UNCLOSED_TOKEN (целое число)
XML_ERROR_PARTIAL_CHAR (целое число)
XML_ERROR_TAG_MISMATCH (целое число)
XML_ERROR_DUPLICATE_ATTRIBUTE (целое число)
XML_ERROR_JUNK_AFTER_DOC_ELEMENT (целое число)
XML_ERROR_PARAM_ENTITY_REF (целое число)
XML_ERROR_UNDEFINED_ENTITY (целое число)
XML_ERROR_RECURSIVE_ENTITY_REF (целое число)
XML_ERROR_ASYNC_ENTITY (целое число)
XML_ERROR_BAD_CHAR_REF (целое число)
XML_ERROR_BINARY_ENTITY_REF (целое число)
XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF (целое число)
XML_ERROR_MISPLACED_XML_PI (целое число)
XML_ERROR_UNKNOWN_ENCODING (целое число)
XML_ERROR_INCORRECT_ENCODING (целое число)
XML_ERROR_UNCLOSED_CDATA_SECTION (целое число)
XML_ERROR_EXTERNAL_ENTITY_HANDLING (целое число)
XML_OPTION_CASE_FOLDING (целое число)
XML_OPTION_TARGET_ENCODING (целое число)
XML_OPTION_SKIP_TAGSTART (целое число)
XML_OPTION_SKIP_WHITE (целое число)

Что вам делать дальше:

Когда все решите — переходите к изучению новой темы.

Рецепты. Примеры кода. Идеи. Планы. И многое другое!

PHP. Библиотека PHPQuery

Есть один очень удобны и полезный инструмент, которым мне нравится пользоваться это jQuery. И больше всего мне нравится его поиск селекторов в документе. Для того что бы найти элемент дерева с необходимо выполнить $(«#mydiv») или же к примеру что бы найти все элементы с классом достаточно $(«.myclass») Это очень удобно! И очень мало кода! Вот она красота!

Но что делать когда возникает необходимость парсить сайты? То есть получить с другого сайта определенную информацию, не загружая весь сайт.

Я очень уважаю компанию mail.ru за то какой они вклад делают в развитие рунета, и по этому я люблю читать их блог на хабре, но порой охота видеть минимальное количество информации, без ненужных элементов и т.д. К примеру на планшете с 3G модема, что бы не грузить много информации.

И тут на помощь приходит PHPQuery. Доступна тут: phpQuery

Собственно для примера работы напишем небольшой скрипт для получения записей с блога mail.ru делаем файл index.php

и первым делом подключаем саму библиотеку

к примеру в будущем нас будут интересовать не только блоги mail.ru. Заведем переменную

и ссылка которая получится будет выглядеть так

то есть по данным хранящимся в $url находится интересующий нас блог. Теперь загрузим страницу которую будем скармливать библиотеке phpQuery

мы получили данные в переменную, но они не особо удобны для работы, так как нет возможности управлять узлами, это обычный HTML документ. теперь разберемся в структуре HTML документа блога

как видим все блоки размещены в одном DIV с классом «company_blog» Если бы использовали jQuery, то что бы найти этот узел использовали $(«.company_blog») Но мы имеем дела с PHPQuery Поэтому с начало подготовим документ для работы.

Теперь у нас есть подготовленная структура, которая является родной для phpQuery. Вот теперь мы можем использовать все удобства. Давайте получим все посты на загруженной странице. Если бы использовали jQuery то выглядело бы это так:

удобно и мало кода. Но мы пишим на PHPQuery

вот после этого все узлы с классом POSTS будут у нас в переменной $hentry Код не сильно отличается от jQuery.


Теперь переберем все элементы POSTS и приведем их к удобному нам виду

foreach ($hentry as $el) <$pq=pq($el); $pq->find(‘div.published’)->remove(); $pq->find(‘div.hubs’)->remove(); $pq->find(‘div.infopanel_wrapper’)->remove(); >

Тут надо сказать пару слов о PQ(. ), это фактически $ в jQuery, по этому везде в место знака доллара используем функцию PQ(); Мы удалили лишние узлы, которые ненужны для нашей верстки.

И наконец выведем в раузер что у нас осталось

Using ua-parser PHP Library from the Command Line

A command line utility is now included with the PHP library. The following commands are supported:

Update the regexes.php File

Fetches an updated YAML file for and overwrites the current regexes.php file. You can use the following as part of a cron job that runs nightly.

By default creates a backup file. Use to turn that feature off.

Grab Just the Latest regexes.yaml File From the Repository

If you need to add a new UA it’s easier to edit the original YAML and then convert it to JSON.

Fetches an updated YAML file. Warning: This method overwrites any existing file.

Parse a Webserver Log File

Parses the supplied log file or log directory to test ua-parser. Saves the UA to a file when the UA or OS family aren’t recognized or when the UA is listed as a generic smartphone or as a generic feature phone.

Multiple and parameters are allowed.

PHP XML Парсер функции

PHP: указывает самую раннюю версию PHP, которая поддерживает эту функцию.

Функция Описание PHP
utf8_decode() Декодирует строку UTF-8 в ISO-8859-1 3
utf8_encode() Кодирует строку ISO-8859-1 в UTF-8 3
xml_error_string() Возвращает строку ошибки из синтаксического анализатора XML 3
xml_get_current_byte_index() Возвращает текущий байтовый индекс из синтаксического анализатора XML 3
xml_get_current_column_number() Возвращает текущий номер столбца из синтаксического анализатора XML 3
xml_get_current_line_number() Возвращает текущий номер строки из синтаксического анализатора XML 3
xml_get_error_code() Возвращает код ошибки из синтаксического анализатора XML 3
xml_parse() Синтаксический анализ XML документа 3
xml_parse_into_struct() Анализ XML данных в массиве 3
xml_parser_create_ns() Создание синтаксического анализатора XML с поддержкой пространства имен 4
xml_parser_create() Создание синтаксического анализатора XML 3
xml_parser_free() Свободный синтаксический анализатор XML 3
xml_parser_get_option() Получение параметров из синтаксического анализатора XML 3
xml_parser_set_option() Задает параметры в XML парсер 3
xml_set_character_data_handler() Устанавливает функцию обработчика для символьных данных 3
xml_set_default_handler() Устанавливает функцию обработчика индекса 3
xml_set_element_handler() Устанавливает функцию обработчика для начального и конечного элемента элементов 3
xml_set_end_namespace_decl_handler() Устанавливает функцию обработчика для конца объявлений пространства имен 4
xml_set_external_entity_ref_handler() Устанавливает функцию обработчика для внешних объектов 3
xml_set_notation_decl_handler() Устанавливает функцию обработчика для объявлений нотации 3
xml_set_object() Использование синтаксического анализатора XML внутри объекта 4
xml_set_processing_instruction_handler() Устанавливает функцию обработчика для обработки инструкции 3
xml_set_start_namespace_decl_handler() Устанавливает функцию обработчика для запуска объявлений пространства имен 4
xml_set_unparsed_entity_decl_handler() Устанавливает функцию обработчика для нерасшифрованных объявлений сущностей 3

Что такое phpQuery

phpQuery — серверный, цепочный, управляемая селекторами CSS3 API DOM, основанный на использовании библиотеки jQuery.

Такое определение дается на официальной странице проекта phpQuery. Если вы использовали jQuery, то, скорее всего, у вас будут идеи, как можно упростить множество задач по манипулированию DOM. phpQuery обеспечивает такой же функционал для использования в коде PHP серверной части приложения. Можно попрощаться с неопрятной генерацией HTML кода с помощью функции echo и аналогичных методов.

С phpQuery вы получаете доступ к большинству функций, реализованных в jQuery. Их можно разделить на 4 больших группы:

  • Создание элементов DOM
  • Выделение и манипулирование элементами
  • Перемещение по структуре DOM
  • Вывод информации в браузере

Вы можете решать задачи с помощью функций phpQuery, которые известны как “раздел портированных функций jQuery”.  Список доступного функционала:

  • Селекторы – поиск элементов по заданным условиям.
  • Атрибуты – работа с атрибутами элементов DOM.
  • Перемещение – переходы по списку выбранных элементов.
  • Манипулирование – добавление и удаление выбранных элементов.
  • AJAX – серверная часть запросов AJAX.
  • События – привязывание событий DOM к выделенным элементам.
  • Утилиты– универсальные функции.

Загрузить библиотеку phpQuery можно со страницы проекта code.google.com/p/phpquery. Скопируйте папку на свой веб сервер и все готово к использованию. Установка закончена и можно запускать файл .

Purpose

This is a universal, language-independent name parser.

Its purpose is to split a single string containing a full name, possibly including salutation, initials, suffixes etc., into meaningful parts like firstname, lastname, initials, and so on.

It is mostly tailored towards english names but works pretty well with non-english names as long as they use latin spelling.

E.g. Mr Anthony R Von Fange III is parsed to

  • salutation: Mr.
  • firstname: Anthony
  • initials: R
  • lastname: von Fange
  • suffix: III

This package has been used by The Iconic in production for years, successfully processing hundreds of thousands of customer names.

Usage

Parsing Functions

$parser->json($payload);		// JSON > Array
$parser->xml($payload);		    // XML > Array
$parser->yaml($payload);		// YAML > Array
$parser->querystr($payload);	// Query String > Array
$parser->serialize($payload);	// Serialized Object > Array
$parser->bson($payload);     	// BSON > Array
$parser->msgpack($payload);   	// MSGPack > Array

Parse Input/Payload (PUT/POST)

$parser = new Parser();
$parser->payload();		                // Auto Detect Type - 'Content Type' HTTP Header
$parser->payload('application/json');	// Specifiy the content type

Helper functions

$parser = new Parser();
$parser->all();                         // Return all values
$parser->has('key');                    // Does a key exist, with value.
$parser->get('key', 'default value');   // Get value by key, set an optional default.
$parser->only('id', 'name', 'email');   // Only return value from the selected keys.
$parser->except('password');            // Don't return values from the selected keys.
$parser->mask($mask);                   // Return masked values (see Mask Function, below).

Mask function

The mask function processes payload data using a configuration mask, thereby returning only a selected subset of the data. It works just like the method but with the added benefit of allowing you to specify a mask in the form of an array, this means you can generate masks on-the-fly based on system and/or user defined conditions.

Demo
Mask

Defining the mask, masks consist of basic array structure, for this particular example we have some rules for the data to be returned they include: — the title of the post — all the body’s for all the comments.

$mask = 
    ]
];
Sample Payload
{
    "post": {
        "title": "Hello World",
        "author": "John Smith",
        "comments": 
    }
}
Applying the Mask
    $parser = new Parser();
    $output = $parser->mask($mask);
Output

This is the output generated as a result of applying the mask against the sample payload provided above.

$output = ,
            
        ]
    ]
];

Wildcards/Special Keys (*, %, :first, :last, :index, :item)

$parser = new Parser();
$parser->has('message.*');          // Does a key exist, with value. (Wildcard key returns first item found)
$parser->get('message.*');          // Get value by key. (Wildcard key returns first item found)
$parser->has('message.:first');     // Does a key exist, with value. (:first key returns first item found)
$parser->get('message.:first');     // Get value by key. (:first key returns first item found)
$parser->has('message.:last');      // Does a key exist, with value. (:last key returns last item found)
$parser->get('message.:last');      // Get value by key. (:last key returns last item found)
$parser->has('message.:index');  // Does a key exist, with value. (:index key returns item at index 0)
$parser->get('message.:index');  // Get value by key. (:index key returns item at index 0)
$parser->has('message.:item');   // Does a key exist, with value. (:item key returns item at index 0)
$parser->get('message.:item');   // Get value by key. (:item key returns item at index 0)

Parse JSON

$parser = new Parser();
$parsed = $parser->json('
	{
		"message": {
			"to": "Jack Smith",
			"from": "Jane Doe",
			"subject": "Hello World",
			"body": "Hello, whats going on..."
		}
	}');

Parse XML

$parser = new Parser();
$parsed = $parser->xml('
			<?xml version="1.0" encoding="UTF-8"?>
			<xml xmlns:ns="http://example.com/xmlns">
				<message status="sent">
					<ns:meta hint="created">Created 5 minutes ago</ns:meta>
					<to>Jack Smith</to>
					<from>Jane Doe</from>
					<subject>Hello World</subject>
					<body>Hello, whats going on...</body>
				</message>
			</xml>');

Parse Query String

$parser = new Parser();
$parsed = $parser->querystr('to=Jack Smith&from=Jane Doe&subject=Hello World&body=Hello, whats going on...');

Parse Serialized Object

$parser = new Parser();
$parsed = $parser->serialize('a:1:{s:7:"message";a:4:{s:2:"to";s:10:"Jack Smith";s:4:"from";s:8:"Jane Doe";s:7:"subject";s:11:"Hello World";s:4:"body";s:24:"Hello, whats going on...";}}');

Parse YAML

$parser = new Parser();
$parsed = $parser->yaml('
				---
				message:
				    to: "Jack Smith"
				    from: "Jane Doe"
				    subject: "Hello World"
				    body: "Hello, whats going on..."
				');
$parser = new Parser();
$parsed = $parser->msgpack('MSGPACK DATA HERE');

Use cases

Use to prepend an id to all selectors

$sMyId = "#my_id";
$oParser = new Sabberworm\CSS\Parser($sText);
$oCss = $oParser->parse();
foreach($oCss->getAllDeclarationBlocks() as $oBlock) {
	foreach($oBlock->getSelectors() as $oSelector) {
		//Loop over all selector parts (the comma-separated strings in a selector) and prepend the id
		$oSelector->setSelector($sMyId.' '.$oSelector->getSelector());
	}
}

Shrink all absolute sizes to half

$oParser = new Sabberworm\CSS\Parser($sText);
$oCss = $oParser->parse();
foreach($oCss->getAllValues() as $mValue) {
	if($mValue instanceof CSSSize && !$mValue->isRelative()) {
		$mValue->setSize($mValue->getSize()/2);
	}
}

Remove unwanted rules

$oParser = new Sabberworm\CSS\Parser($sText);
$oCss = $oParser->parse();
foreach($oCss->getAllRuleSets() as $oRuleSet) {
	$oRuleSet->removeRule('font-'); //Note that the added dash will make this remove all rules starting with font- (like font-size, font-weight, etc.) as well as a potential font-rule
	$oRuleSet->removeRule('cursor');
}

Output

To output the entire CSS document into a variable, just use :

$oCssParser = new Sabberworm\CSS\Parser(file_get_contents('somefile.css'));
$oCssDocument = $oCssParser->parse();
print $oCssDocument->render();

If you want to format the output, pass an instance of type :

$oFormat = Sabberworm\CSS\OutputFormat::create()->indentWithSpaces(4)->setSpaceBetweenRules("\n");
print $oCssDocument->render($oFormat);

Or use one of the predefined formats:

print $oCssDocument->render(Sabberworm\CSS\OutputFormat::createPretty());
print $oCssDocument->render(Sabberworm\CSS\OutputFormat::createCompact());

To see what you can do with output formatting, look at the tests in .

License

PHP-CSS-Parser is freely distributable under the terms of an MIT-style license.

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the «Software»), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED «AS IS», WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

Как использовать phpQuery

Для примера сделаем неупорядоченный список с двумя колонками, заголовками и различными цветами для четных и нечетных строк, как на изображении ниже:

Сначала создаем HTML документ с помощью phpQuery:

<?php
require("phpQuery/phpQuery.php");
$doc = phpQuery::newDocument("<div/>");

Выше приведенный код генерирует основу HTML документа с тегом . В библиотеке есть несколько методов для создания документа. Мы используем самый простой. Остальные методы можно найти в файле и документации.

Теперь нужно создать неупорядоченный список и добавить его в наш документ HTML.

<?php
...
$doc->append("<ul><li>Product Name</li><li>Price</li></ul>");
$products = array(
    array("Product 1","$30"),
    array("Product 2","$50"),
    array("Product 3","$20"));

foreach($products as $key=>$product) {
    $doc->append("<li>$product</li><li>$product</li>");
}
print $doc;

Теперь у нас есть неупорядоченный список. Но все элементы расположены в одну колонку по умолчанию. Нужно переместить четные элементы списка во вторую колонку:

<?php
...
$doc->attr("style", "width:420px;");
$doc->find("li:even")->attr("style","width:200px; float:left; padding:5px; liststyle:none;");
$doc->find("li:odd")->attr("style","width:200px; float:left; padding:5px; liststyle:none;");

Используем атрибуты style для определения стилей CSS для нашего примера (не стоит пользоваться встроенными стилями, если нет особенной нужды). Для стилей лучше использовать классы CSS.

Теперь выделим заголовок и четные строки с числами, используя методы phpQuery:

<?php
...
$doc->find("li:nthchild(4n)")->attr("style","background:#EEE; width:200px; float:left; padding:5px; liststyle:none;");
$doc->find("li:nth-child(4n-1)")->attr("style","background:#EEE; width:200px; float:left; padding:5px; list-style:none;");
$doc->find("li:lt(1)")->attr("style","background:#CFCFCF; width:200px; float:left; padding:5px; liststyle:none;");

Простой пример завершен и вы теперь имеете представление как phpQuery может упростить генерацию HTML на серверной стороне. Все действия очень похожи на действия с jQuery? за исключение того, что мы работали с объектом .

Modifying The Dom

You can always modify the dom that was created from any loading method. To change the attribute of any node you can just call the method.

use PHPHtmlParser\Dom;

$dom = new Dom;
$dom->loadStr('<div class="all"><p>Hey bro, <a href="google.com">click here</a><br /> :)</p></div>');
$a = $dom->find('a')[];
$a->setAttribute('class', 'foo');
echo $a->getAttribute('class'); // "foo"

You may also get the class directly and manipulate it as you see fit.

use PHPHtmlParser\Dom;

$dom = new Dom;
$dom->loadStr('<div class="all"><p>Hey bro, <a href="google.com">click here</a><br /> :)</p></div>');
/** @var Dom\Node\AbstractNode $a */
$a   = $dom->find('a')[];
$tag = $a->getTag();
$tag->setAttribute('class', 'foo');
echo $a->getAttribute('class'); // "foo"

It is also possible to remove a node from the tree. Simply call the method on any node to remove it from the tree. It is important to note that you should unset the node after removing it from the `DOM«, it will still take memory as long as it is not unset.

use PHPHtmlParser\Dom;

$dom = new Dom;
$dom->loadStr('<div class="all"><p>Hey bro, <a href="google.com">click here</a><br /> :)</p></div>');
/** @var Dom\Node\AbstractNode $a */
$a   = $dom->find('a')[];
$a->delete();
unset($a);
echo $dom; // '<div class="all"><p>Hey bro, <br /> :)</p></div>');

You can modify the text of objects easely. Please note that, if you set an encoding, the new text will be encoded using the existing encoding.

use PHPHtmlParser\Dom;

$dom = new Dom;
$dom->loadStr('<div class="all"><p>Hey bro, <a href="google.com">click here</a><br /> :)</p></div>');
/** @var Dom\Node\InnerNode $a */
$a   = $dom->find('a')[];
$a->firstChild()->setText('biz baz');
echo $dom; // '<div class="all"><p>Hey bro, <a href="google.com">biz baz</a><br /> :)</p></div>'

5 последних уроков рубрики «PHP»

Когда речь идёт о безопасности веб-сайта, то фраза «фильтруйте всё, экранируйте всё» всегда будет актуальна. Сегодня поговорим о фильтрации данных. Обеспечение безопасности веб-сайта — это не только защита от SQL инъекций, но и протекция от межсайтового скриптинга (XSS), межсайтовой подделки запросов (CSRF) и от других видов атак

В частности, вам нужно очень осторожно подходить к формированию HTML, CSS и JavaScript кода. Expressive 2 поддерживает возможность подключения других ZF компонент по специальной схеме. Не всем нравится данное решение

В этой статье мы расскажем как улучшили процесс подключение нескольких модулей. Предположим, что вам необходимо отправить какую-то информацию в Google Analytics из серверного скрипта. Как это сделать. Ответ в этой заметке. Подборка PHP песочниц Подборка из нескольких видов PHP песочниц. На некоторых вы в режиме online сможете потестить свой код, но есть так же решения, которые можно внедрить на свой сайт.


С этим читают