(.+)
Получить текст между тегами HTML
Хорошо, это довольно простой вопрос, но я им не знаком с PHP и не смог понять это. Строка ввода – это $ data im, пытающаяся продолжать тянуть и использовать только первое совпадение. Неправильно ли это? Это может быть даже не лучший способ выполнить действие, im просто пытается вытащить содержимое между двумя html-тегами (первый набор найден) и отбросить остальную часть данных. Я знаю, что есть похожие вопросы, я читаю их все, мой вопрос – это смесь, если это лучший способ сделать это и как я могу определить совпадение в качестве нового ввода для остальной части оставшегося кода. Если я изменяю $ matches на $ data2 и использую его оттуда, он возвращает ошибки.
Использование регулярных выражений, как правило, является хорошей идеей для вашей проблемы.
Когда вы посмотрите на http://php.net/preg_match, вы увидите, что $ matches будет массивом, так как может быть несколько совпадений. Пытаться
чтобы получить представление о том, как выглядит результат, а затем выбрать правильный индекс.
Если есть совпадение, вы можете получить текст, извлеченный между группой скобок, с помощью
Если у вас было более одной группы скобок, они были бы пронумерованы 2, 3 и т. Д. Вы также должны рассмотреть случай, когда совпадения нет, и в этом случае массив будет иметь размер 0.
Не анализируйте HTML через preg_match , вместо этого используйте этот класс PHP:
Класс DOMDocument
hi H1 title
H2 title
H2 title
"; // a new dom object $dom = new domDocument('1.0', 'utf-8'); // load the html into the object ***/ $dom->loadHTML($html); //discard white space $dom->preserveWhiteSpace = false; $hTwo= $dom->getElementsByTagName('h2'); // here u use your desired tag echo $hTwo->item(0)->nodeValue; //will return "H2 title"; ?>
Вы можете сделать это так:
Это приведет к отключению или разворачиванию ТЕКСТа из HTML-тегов
Источник
Поиск и замена текста между тегами в PHP
И из него нужно достать текст, который находится между тегами и .
Проще всего это сделать с помощью регулярных выражений:
$text = 'Ищем эту и может быть эту строки в тексте.
'; if(preg_match_all('|(.*)|Uis', $text, $result)) < foreach($result[1] as $span_text) echo $span_text . '
'; > else echo 'Совпадений нет';
Функция preg_match_all() принимает 3 параметра: шаблон поиска, сам текст и переменную, в которую эта функция сохранит результаты поиска.
Поскольку функция возвращает количество найденных строк (или false в случае ошибки), мы можем сразу подставить её в оператор if.
Массив с результатами поиска (в нашем случае $result) состоит из двух частей: в $result[0] будут найденные строки вместе с открывающим и закрывающим тегами span, а в $result[1] будут те же строки без тега span, т.е. тот текст, что находится в круглых скобках.
Маска регулярного выражения находится между вертикальными чертами | . В шаблоне (.*) точка означает любой символ, звёздочка — любое количество символов (т.е. суммарно получаем «любое количество любых символов»).
Скобки говорят, что найденный текст нам нужно получить отдельно. Без скобок мы получим только $result[0], а $result[1] не будет существовать.
Чтобы найти только не пустые теги, можно заменить .* на .+ . Плюсик означает любое количество символов, но не меньше одного.
Uis — модификаторы. U означает работу с UTF-8, i — регистронезависимый поиск, s — что символ точка включает в себя переносы строк, т.е. поиск будет по всем строкам, а не по одной.
Простая замена текста или тегов (preg_replace)
Заменить текст без замены тегов можно следующим образом:
$text = 'Строки один и два в тексте.
'; $new_text = preg_replace('|().*()|Uis', '$1три$2', $text); echo $new_text; // Выведет: Строки три и три в тексте.
$1 и $2 содержат открывающий и закрывающий теги соответственно, поскольку мы поместили их в скобки.
А в следующем примере меняются только теги, сам текст остаётся нетронутым:
Строки один и два в тексте.'; $new_text = preg_replace('|(.*)()|Uis', '$1', $text); echo $new_text; // Строки один и два в тексте.
Замена текста собственной функцией (preg_replace_callback)
Самое вкусное. Допустим, мы хотим использовать на сайте что-то вроде BBCode, т.е. собственные теги, которые потом должны заменяться на обычный HTML код:
Заменить тег на обычный HTML тег можно так:
Заголовок
'; $new_text = preg_replace_callback('|(.*)
|Uis', function($matches) < return '' . $matches[1] . '
'; >, $text); echo $new_text; Функция preg_replace_callback передаёт каждую найденную строку в нашу безымянную функцию, затем заменяет найденный текст на то, что наша функция возвращает.
Не знаком с безымянными функциями? Тогда можно сделать так:
function replaceH1($matches) < return '' . $matches[1] . '
'; > $text = 'Заголовок
'; $new_text = preg_replace_callback('|(.*)
|Uis', 'replaceH1', $text); echo $new_text;
Вторым параметром передаём название нашей функции. Код отработает точно также, как и предыдущий.
Вывод фрагментов исходного HTML и PHP кода
Частая проблема разработчиков, которым хочется вести свой блог. Есть HTML статья, внутри которой некоторые фрагменты кода нужно прогонять через htmlspecialchars() , чтобы они выводились как обычный текст:
$text =' Пример кода
Этот текст не должен быть жирным
Какое-то описание кода выше.
Второй не жирный текст
';
Теперь в этом нет ничего сложного:
$text = ' Пример кода
Этот текст не должен быть жирным
Какое-то описание кода выше.
Второй не жирный текст
'; $new_text = preg_replace_callback('|(.*)
|Uis', function($matches) < return htmlspecialchars($matches[1], ENT_QUOTES, 'UTF-8'); >, $text); echo $new_text;
Продвинутый BBCode с атрибутами
Иногда описанного выше функционала бывает недостаточно, например если нужно передать в функцию какие-либо параметры:
Вместо собственного велосипеда рекомендую использовать готовую библиотеку Shortcode.
В ней из коробки уже есть возможность использования атрибутов, а также события и куча других полезных фишек. Вот как может выглядеть пример обработки тега с атрибутами:
use Thunder\Shortcode\ShortcodeFacade; $text = 'текст с тегами'; $shortcode = new ShortcodeFacade(); $shortcode->addHandler('link', function($s) < $content = $s->getContent(); $url = $s->getParameter('url'); $title = $s->getParameter('title'); if(!$title) $title = 'Стандартный заголовок'; // Ещё какие-нибудь действия return $content; >); $new_text = $shortcode->process($text);
Только нужно учесть, что в Shortcode по-умолчанию парсятся атрибуты в квадратных скобках [] . Я и сам использую квадратные, но в примерах использовал фигурные, чтобы избежать возможных конфликтов тегов на этом сайте.
Источник
Поиск и замена текста между тегами на PHP
Рассмотрим примеры обработки и замены текста между HTML тегами, используя PHP функции для поиска и подмены по регулярным выражениям. Для примера возьмем абстрактный кусок кода, над которым будем проводить различные действия.
На месте может быть любой тег, а троеточие обозначает любой произвольный текст.
Поиск текста функцией «preg_match_all»
Для поиска текста внутри тегов воспользуемся функцией «preg_match_all». Зададим маску поиска и посмотрим, что она возвращает в качестве результата.
$sContent = ". наташа . даша . настя . "; if (preg_match_all('|(.+)|isU', $sContent, $arr)) < echo $arr[0][0] . " " . $arr[0][1] . " " . $arr[0][2] . "
"; echo $arr[1][0] . " " . $arr[1][1] . " " . $arr[1][2]; > //на выходе получаем: //наташа даша настя //наташа даша настя
В нулевой разряд массива записались значения с тегами, а в первый — только текст между ними. Если требуется автоматизировать вывод всего найденного, то лучше использовать цикл foreach . Его рассмотрим ниже.
Функция preg_match_all возвращает «1» в случае нахождения в тексте соответствия с указанной маской или «0», если соответствий не найдено. В качестве параметров принимает маску, строку где ищем и переменную, в которую будут записаны найденные совпадения.
Маска поиска обрамляется символами «|». За ними идут директивы — «isU» обозначает регистронезависимый поиск в многострочном тексте с кодировкой «UTF-8»
В самом правиле содержатся теги, между которыми требуется заменить текст — «(.+)». Точка символизирует любой символ, а плюс — что он может повторяться один или больше раз. Скобки говорят о том, что содержимое между ними нужно записать в переменную с результатом.
Перебор найденных результатов в цикле «foreach»
Для вывода результатов поиска можно воспользоваться циклом «foreach».
$sContent = ". Наташа . Марина . Настя . "; if (preg_match_all('|(.+)|isU', $sContent, $arr)) < foreach ($arr[0] as $value) echo $value." "; echo "
"; foreach ($arr[1] as $value) echo $value." "; >
На выходе получаем тоже самое что и в предыдущем примере, зато теперь мы автоматизировали перебор массива и сократили код.
Отличие «preg_match» от «preg_match_all»
Функция «preg_match» осуществляет поиск только до первого соответсвия с маской. Как только что-то найдено — поиск останавливается и возвращается одномерный массив.
if (preg_match('||isU', $sContent, $arr)) return $arr[1]; else return false;
Здесь нулевой элемент массива «$arr» содержит найденное совпадение вместе с тегами «title», а первый элемент — «$arr[1]» только текст между этими тегами. Если в строке несколько тегов «title», это не значит что остальные значения будут записаны в «$arr[2]» и так далее. Элемент «$arr[2]» окажется не пуст если в маске указано несколько правил, но об этом в следующий раз.
Замена текста между тегами функцией «preg_replace»
Если требуется найти и произвести замену найденных элементов в строке, то на помощь приходит PHP функция «preg_replace».
Заменим в нашем примере все имена между тегами на какое-то конкретное, например — «Оля».
$sContent = "наташа . даша . настя"; $sContent = preg_replace('|().+()|isU', "$1"."Оля"."$2",$sContent);
Замена тегов, оставляя всё, что находится внутри
А теперь небольшой пример, показывающий как заменить определенные теги, сохранив содержимое между ними. Допустим, надо изменить в html коде все «strong» на CSS форматирование.
$sContent = ". Настя . "; $sContent = preg_replace('||isU', '', $sContent); //на выходе получаем $sContent: //. Настя .
Обработка и замена при помощи «preg_replace_callback»
Переходим к самому интересному. Если нужно над найденным фрагметом произвести какие-то действия и только потом осуществить замену, то следует использовать «preg_replace_callback». Рассмотрим как с помощью этой функции в именах сделать первую букву заглавной.
наташа . даша . настя"; echo htmlspecialchars($sContent); echo "
"; $sContent = preg_replace_callback('|()(.+)()|iU', function($matches) < $matches[2] = mb_substr(mb_strtoupper($matches[2], 'UTF-8'),0,1,'UTF-8').substr($matches[2], 2); return $matches[1].$matches[2].$matches[3]; >,$sContent); echo htmlspecialchars($sContent); ?>
В качестве параметров передаём маску поиска, функцию с кодом обработки и строковую переменную в которой осуществляем поиск. Дополнительно могут ещё быть заданы два необязательных параметра. О них в следующем разделе статьи.
Переменная «$matches» это массив, содержащий элементы регулярного выражения. В нулевом элементе будет содержаться вся исходная строка, а в остальных — содержимое скобок.
Код обработки не описываю, но отмечу что для замены первой буквы на заглавную я использую PHP функции для работы со строками в UTF-8 кодировке. Если у Вас кодировка cp1251, то нужно отбросить префикс «mb_» и удалить последний параметр у функций.
ВНИМАНИЕ! Код в примере будет работать только при использовании PHP версии 5.3 и выше. Для более поздних версий требуется доработка.
Использование нумирации в заменах и другие продвинутые возможности
Теперь немного о продвинутых возможностях функции «preg_replace_callback». Ранее я упоминал что у неё есть два необязательных параметра. Первый (по умолчанию равен «-1») содержит максимальное количество замен, которое должна произвести функция. Второй — переменная, в которую будет записано количество произведенных замен.
$sContent = preg_replace_callback('|()(.+)()|iU', function($matches) < //тут код >,$sContent,2,$count);
Задав эти два параметра в предыдущем примере, замена главной буквы будет произведена только у первых двух имён. Соответственно, переменная «$count» будет содержать — 2. Если установить первый дополнительный параметр в «-1», то «$count» будет — 3.
И в конце о том, как узнать какая по счету замена происходит в данный момент. Это может потребоваться если появилась необходимость произвести замену между пятым и десятым найденным элементом строки или требуется для каких-то тегов прописать уникальные идентификаторы.
Для реализации может быть использована глобальная или статическая переменная. Использование глобальных переменных может быть отключено в PHP, поэтому рассмотрим пример со статической переменной. Присвоим всем тегам h2 уникальный идентификатор.
Марина Алёша Наташа
Катя
'; $str = preg_replace_callback('|(.+)
|iU', function($matches)< static $id = 0; $id++; return ''.$matches[1].'
'; >, $str,-1,$count); echo $str.' Количество замен: '.$count; ?>
Объявляя статическую переменную нужно помнить что она сохраняет своё значение между вызовами функции, поэтому идеально подходит для решения нашей задачи.
Источник