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
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
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
Читай preg_replace. При желании можно регуляркой даже id из тэга выдернуть и подменять на нужное значение массива. Ну или просто меняешь [project=1 ] на $title1.
ответ дан 18 окт 2018 в 7:32
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
ЭдуардЭдуард
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 руб./за проект