Php как найти теги php

irfan dot swen at gmail dot com

3 months ago


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h1>PHP Language</h1>
    <?php echo "1) PHP Special Syntax Code"; ?><br>

    <?= "2) PHP Special Syntax Code"; ?><br>

    <!-- Not Working-->  <? "3) PHP Special Syntax Code" ?> 
</body>
</html>


anisgazig at gmail dot com

1 year ago


If you want your file to be interpreted as php then your file must start and end with <?php and ?> and everything outside of that is ignored by the php parser.

<?php
php code
..//parsed
php code..//parsed
?>
hellow..//normal test but ignred by php parser

Three types of tag are available in php
1.normal tag(<?php ?>)
2.short echo tag(<?= ?>)
3.short tag(<? ?>)

short tag are bydefault available but can be disabled by short_open_tag = Off and also disabled bydefault if php will  built with --disabe--short--tags()

As short tag can be disabled so only use the normal and short echo tag.

If your file only have php code then  do not use closing tag.
<?php
//php code;
//php code;
//php code;
but if you are embedding php with html then enclose php code with opening and closing tag.
<
html>
<
head>
</
head>
<
body>
<?
php
//php code;
//php code;
//php code;
?>
</body>
</html>

If you want to just print single text or something ,you should use shorthand version .<?= $var ?>

But if you want to process something, you should use normal tag.
<?php
       
//$var = 3;
        //$var2 = 2;
        //$var3 = $var+$var2;
        //if($var3){//result}
?>

If you embedded php with html and single line, do not need to use semicolon
<html>
<head>
<body>
<?= $var ?>
</body>
</head>
</html>
but if you have multiple line, then use semicolon.
<?php
//line 1;
//line 2;
//line 3;
?>


Есть строка (переменная $content_page ), в которой записан текст, и в нем, в разных местах есть теги вида:

[proekt= 1]
[proekt= 7]

На странице это выглядит примерно так:

текст-текст текст [proekt= 1] еще текст [proekt= 7] и снова текст

Вопрос. Каким образом вместо [proekt= 1] , [proekt= 7] вывести нужный мне php код, а именно я хочу вывести там запись из базы с указанным id (1, 7 в моем случае). И нужно вывести их в том месте где стоят эти теги.

Скрипт самописный. Буду благодарен за помощь, полезную информацию.

задан 18 окт 2018 в 7:14

iKey's user avatar

1

Как пример, а там разберетесь сами:

$content = "текст-текст текст [proekt= 1] еще текст [proekt= 7] и снова текст";
preg_match_all('/[(.*)= (.*)]/iU', $content, $tags, PREG_SET_ORDER);
foreach ($tags as $value) {
    var_dump('Tag: ' . $value[0]);
    var_dump('Key: ' . $value[1]);
    var_dump('Value: ' . $value[2]);

    //  Для примера: заменить "[proekt= 7]" на "Hello"
    if (($value[1] == 'proekt') && ($value[2] == '7')) {
        $content = str_replace($value[0], 'Hello', $content);
    }
}
var_dump($content);

ответ дан 18 окт 2018 в 7:31

Manitikyl's user avatar

ManitikylManitikyl

9,1644 золотых знака23 серебряных знака46 бронзовых знаков

Вот пример с использованием preg_replace_callback

$content_page = "текст-текст текст [proekt= 1] еще [proekt= 3217] текст [proekt= 7] и снова текст [0=0] ";

$projects = [
    [
        'id' => 1,
        'name' => '«Первый проект»'
    ],
    [
        'id' => 7,
        'name' => '«Седьмой проект»'
    ]
];

echo preg_replace_callback('/[([a-z0-9_]+)= ([0-9]+)]/iU', function($matches) use ($projects){
    $key = $matches[1];
    $value = $matches[2];
    if ($key === 'proekt') {
        $projectsNames = array_column($projects, 'name', 'id');
        return $projectsNames[$value] ?? '«Проект не существует»';
    }
    return $matches[0];
},$content_page);

ответ дан 18 окт 2018 в 7:49

Евгений Миронов's user avatar

Читай preg_replace. При желании можно регуляркой даже id из тэга выдернуть и подменять на нужное значение массива. Ну или просто меняешь [project=1 ] на $title1.

ответ дан 18 окт 2018 в 7:32

Movs's user avatar

MovsMovs

2011 серебряный знак7 бронзовых знаков

1

$content_page = 'текст-текст текст [proekt= 1] еще текст [proekt= 7] и снова текст';

$search = ['[proekt= 1]', '[proekt= 7]'];
$replace = ['Новый проект 1', 'Новый проект 7'];
$content_page = str_replace($search, $replace, $content_page);

echo $content_page; // текст-текст текст Новый проект 1 еще текст Новый проект 7 и снова текст

ответ дан 18 окт 2018 в 7:43

Эдуард's user avatar

ЭдуардЭдуард

11.4k4 золотых знака17 серебряных знаков28 бронзовых знаков

  • Юбилейный DevConfX пройдет 21-22 июня в Москве. Как всегда — Вы решаете, кто попадет в программу секции Backend — голосуйте за интересные доклады

  • Автор темы

    d i m i x

  • Дата начала

    7 Май 2005

Статус
В этой теме нельзя размещать новые ответы.

d i m i x

Guest


  • #1

PHP — поиск тегов, замена, вывод.

Привет ребята!
Классный у вас форум, нашел многие ответы на вопросы. Но некоторые остались без ответов. Я думаю у многих, кто транслирует инфу с других сайтов, есть потребности в этих функциях.

Что мне нужно от php:
1. Найти в файле html теги, например <h1>123<h1>
2. Вывести их например в $title
3. Превратить $title из html-кода в обычный текст

Пути к файлам уже прописаны. Нужны только сами функции.
Всем буду очень благодарен!

Nimous

Guest


Фанат


d i m i x

Guest


  • #4

PHP — поиск тегов и вывод текста в переменную

Всем привет!
Это не для вареза или взлома, поэтому прошу не закрывать тему.

Прошу помочь решить такой вопрос. Нужно найти на странице теги с <td width=»100%» bgcolor=»#FFEECC»> до </a></td> и вывести их в переменную $title предварительно вырезав теги из этой переменной.

У меня стоит так $title = strip_tags(‘<h1>abcdef</h1>’);
А надо чтобы вместо <h1>abcdef</h1> были найденные теги.

Большое спасибо за ответ!

Фанат


  • #5

здесь общаются те, кто создаёт свои сайты, а не тырит с чужих.

d i m i x

Guest


  • #6

Фанат, я не тырю инфу.

Мне это нужно для трансляции каталга ссылок со своих-же сайтов, на которых один каталог на всех. И заголовок не могу настроить. Можно только выдрать из таблицы. Открой тему пожалуйста… Большое спасибо! Правила я читал.

Фанат


  • #7

если это твои сайты, то ты прекрасно можешь выдавать с них инфу в любом формате, чтобы не приходилось потом расковыривать.
Сказки на этом форуме тоже оффтопик.

d i m i x

Guest


  • #8

Фанат, мне на самом деле это надо для своих сайтов, я очень удивлён твоим нежеланием сделать нормальную тему. На разных сайтах разные структуры кода и естественно скриптов. Мне гораздо проще сделать на каждом сайте отдельный скрипт для обработки, чем лепить кучу скриптов в сам каталог. Ну на самом деле, ё-маё.
Может в силу моей необразованности в php мне так легче, тем не менее мне так надо.

Статус
В этой теме нельзя размещать новые ответы.

Поиск текста между тегами

Допустим, у нас есть следующий текст:

$text = '<p>Ищем <span>эту</span> и <span>может быть эту</span> строки в тексте.</p>';

И из него нужно достать текст, который находится между тегами <span> и </span>.

Проще всего это сделать с помощью регулярных выражений:

$text = '<p>Ищем <span>эту</span> и <span>может быть эту</span> строки в тексте.</p>';

if(preg_match_all('|<span>(.*)</span>|Uis', $text, $result))
{
	foreach($result[1] as $span_text)
		echo $span_text . '<br>';
}
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 = '<p>Строки <strong>один</strong> и <strong>два</strong> в тексте.</p>';

$new_text = preg_replace('|(<strong>).*(</strong>)|Uis', '$1три$2', $text);

echo $new_text;
// Выведет: <p>Строки <strong>три</strong> и <strong>три</strong> в тексте.</p>

$1 и $2 содержат открывающий и закрывающий теги соответственно, поскольку мы поместили их в скобки.

А в следующем примере меняются только теги, сам текст остаётся нетронутым:

<?php
$text = '<p>Строки <strong>один</strong> и <strong>два</strong> в тексте.</p>';

$new_text = preg_replace('|<strong>(.*)(</strong>)|Uis', '<span>$1</span>', $text);

echo $new_text;
// <p>Строки <span>один</span> и <span>два</span> в тексте.</p>

Замена текста собственной функцией (preg_replace_callback)

Самое вкусное. Допустим, мы хотим использовать на сайте что-то вроде BBCode, т.е. собственные теги, которые потом должны заменяться на обычный HTML код:

<div>
    {h1}Заголовок{/h1}
</div>

Заменить тег {h1} на обычный HTML тег <h1> можно так:

<?php
$text = '<div>{h1}Заголовок{/h1}</div>';

$new_text = preg_replace_callback('|{h1}(.*){/h1}|Uis', function($matches) {
	return '<h1>' . $matches[1] . '</h1>';
}, $text);

echo $new_text;

Функция preg_replace_callback передаёт каждую найденную строку в нашу безымянную функцию, затем заменяет найденный текст на то, что наша функция возвращает.

Не знаком с безымянными функциями? Тогда можно сделать так:

function replaceH1($matches) {
	return '<h1>' . $matches[1] . '</h1>';
}

$text = '<div>{h1}Заголовок{/h1}</div>';

$new_text = preg_replace_callback('|{h1}(.*){/h1}|Uis', 'replaceH1', $text);

echo $new_text;

Вторым параметром передаём название нашей функции. Код отработает точно также, как и предыдущий.

Вывод фрагментов исходного HTML и PHP кода

Частая проблема разработчиков, которым хочется вести свой блог. Есть HTML статья, внутри которой некоторые фрагменты кода нужно прогонять через htmlspecialchars(), чтобы они выводились как обычный текст:

$text ='
<h2>Пример кода</h2>
{code}<strong>Этот текст не должен быть жирным</strong>{/code}
<p>Какое-то описание кода выше.</p>
{code}<strong>Второй не жирный текст</strong>{/code}
';

Теперь в этом нет ничего сложного:

$text = '
<h2>Пример кода</h2>
{code}<strong>Этот текст не должен быть жирным</strong>{/code}
<p>Какое-то описание кода выше.</p>
{code}<strong>Второй не жирный текст</strong>{/code}
';

$new_text = preg_replace_callback('|{code}(.*){/code}|Uis', function($matches) {
	return htmlspecialchars($matches[1], ENT_QUOTES, 'UTF-8');
}, $text);

echo $new_text;

Продвинутый BBCode с атрибутами

Иногда описанного выше функционала бывает недостаточно, например если нужно передать в функцию какие-либо параметры:

{link url="/some_url" title="Заголовок ссылки"}текст ссылки{/link}

Вместо собственного велосипеда рекомендую использовать готовую библиотеку Shortcode.

В ней из коробки уже есть возможность использования атрибутов, а также события и куча других полезных фишек. Вот как может выглядеть пример обработки тега с атрибутами:

use ThunderShortcodeShortcodeFacade;

$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 по-умолчанию парсятся атрибуты в квадратных скобках []. Я и сам использую квадратные, но в примерах использовал фигурные, чтобы избежать возможных конфликтов тегов на этом сайте.

Добрый день,
Нужно осуществить поиск H-тегов в контенте
Сейчас так

preg_match_all('/<[hH]([2-6])>(.*?)</[hH][2-6]>/',$content,$matches);

Находит все H2-6, но игнорит теги типа

<h3 style="text-align: center;"><strong>Какой-то заголовок</strong></h3>

Как доработать регулярку? Чтоб находило теги и со style и с class и т.д.

Спасибо большое


  • Вопрос задан

    более трёх лет назад

  • 302 просмотра

Пригласить эксперта

preg_match_all('/<[hH]([2-6]).*?>(.*?)</[hH][2-6]>/', $content, $matches);

или так, потому что некоторые из выражений у вас лишние:

preg_match_all('/<h[2-6].*?>(.*)</h[2-6]>/i', $content, $matches);

preg_match_all('/<h([2-6])[^>]*>(.*)</h[2-6]>/iUusm',$content,$matches);

Лучше воспользуйтесь предназначенными для работы с DOM инструментами. Из коробки в php есть встроенный функционал, а есть библиотеки попроще, например вот.


  • Показать ещё
    Загружается…

27 мая 2023, в 17:14

1000 руб./за проект

27 мая 2023, в 16:56

6000 руб./за проект

27 мая 2023, в 16:54

20000 руб./за проект

Минуточку внимания

Понравилась статья? Поделить с друзьями:

Не пропустите также:

  • Как составить эмоциональную речь
  • Как найти сумму десятичного числа
  • Как найти лучшую подругу в школе
  • Как найти число орбиталей на энергетическом уровне
  • Как найти свое объявление по номеру телефона

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии