Ru-Board.club
← Вернуться в раздел «Web-программирование»

» PHP: Регулярные выражения (RegExp, Regular, eregi, preg)

Автор: Cheery
Дата сообщения: 19.03.2009 01:08
ForposT_ForeveR
обычный replace
$str=preg_replace('/<a[^>]+>(.*)<\/a>/',"$1",$str);
что то такое
Автор: intrigued
Дата сообщения: 25.03.2009 18:02
Здравствуйте, уважаемые эксперты!

Помогите, пожалуйста, разобраться с таким вопросом:

есть некий html текст, например:

Код: <html>
<head>
<title>This is a test</title>
</head>
<body bgcolor="white">
<img src="http://www.megasite.com/mycoolsite/papka/file.jpg" width="23" height="56" alt="" />
<h1>This is a test</h1>
<p>First paragraph</p>
<p><a href="http://www.site.com/">Link</a> paragraph</p>
<!--More boring stuff omitted

-->
<b>bold text</b>
<img src="howdy.html" />text
<a href="#">link</a>
</body>
</html>
Автор: Cheery
Дата сообщения: 25.03.2009 18:08
intrigued

Цитата:
загнать его в переменную, произвести какие-то манипуляции над "голым текстом" и затем вернуть все теги обратно, чтобы в результате получилась переменная с преобразованным текстом.

"вернуть обратно"? вам не регулярка нужна..
а работа с XML или DOM.. вот пример класса
http://simplehtmldom.sourceforge.net/manual.htm
Автор: intrigued
Дата сообщения: 25.03.2009 18:23
Cheery, спасибо за ответ, но думаю, предложенный вами вариант слишком громоздкий для моих нужд... Попытаю объснить для чего мне все это нужно, возможно есть менее мозголомный вариант.

Есть некая CMS с визуальным редактором для наполнения контента, бывают случаи, что юзер вставляет изображения в контент или просто ссылки, у меня при сабмите формы стоит проверка на регулярке:

Код: $value = preg_replace("/([^\s]{30})[^\s]+/", "$1...", $value);
Автор: Cheery
Дата сообщения: 25.03.2009 18:33
intrigued

Цитата:
Может есть какие-то решения?

так все же - вам надо
Цитата:
и затем вернуть все теги обратно

или нет? или просто вырезать теги и все?
если вырезать, то
www.php.net/strip_tags
Автор: intrigued
Дата сообщения: 25.03.2009 18:45
Cheery, я вижу 2 варианта, но, к сожалению, не знаю правильной реализации:
1) вырезать регуляркой все теги с атрибутами (это я умею), оставшийся "голый" текст без тегов проанализировать на наличие запрещенной длины слова, если таковые есть - обрезать (это тоже не проблема), затем вернуть все теги на место к уже преобразованному тексту (это я не знаю как реализовать);
2) проанализировать весь текст вместе с тегами и т.п., НО изменить только текст все тегов (тут я вообще не знаю с какой стороны подойти).
Вот. Можно ли это как-то сделать, не прибегая к помощи предложенного вами класса?
Автор: Cheery
Дата сообщения: 25.03.2009 18:46
intrigued

Цитата:
(это я не знаю как реализовать);

только с использованием DOM или XML. иначе как вы на место все теги "прикрутите"?

Цитата:
Можно ли это как-то сделать, не прибегая к помощи предложенного вами класса?

не думаю
Автор: intrigued
Дата сообщения: 25.03.2009 18:53

Цитата:
не думаю

жаль...

спасибо за помощь!

Добавлено:
Вот что в итоге получилось с предложенным классом:


Код: <?php

// include PHP Simple HTML DOM Parser
require_once("simple_html_dom.php");

// Source
$content = "<strong>Lorem ipsum dolor</strong> sit amet,
<span style=\"color:#FF6600;\">consectetur</span> adipiscing elit. Donec id
justo. <span style=\"background-color:#C0C0C0;\">Duis eu felis</span> sed nulla
elementum gravida. <em>Phasellus semper</em>, nunc <span style=\"color:#FFFFFF;\">f<span
style=\"background-color:#008080;\">ringilla viverra</span></span> cursus, <u>augue
diam</u> tincidunt <span style=\"color:#0000FF;\">ligula</span>, <span style=\"font-family:Times
New Roman;\">condimentum vestibulum</span> eros nisi et est. Quisque eget velit. In hac habitasse
platea <span style=\"font-size:medium;\">dictumst</span>. Ut libero sapien, porta non, <span
style=\"color:#FF0000;\"><strike>ullamcorper</strike></span> at, pulvinar.\n"
;

// dump contents of DOM object
$html = str_get_html($content);

echo $html . "<br /><br />\n -------------------------- \n<br /><br />";

// find & modifies all HTML inner elements
foreach($html->find('text') as $e)
{
    $e->outertext = strtoupper($e);
}

// print result
echo $html;

?>
Автор: ForposT_ForeveR
Дата сообщения: 30.03.2009 00:49
Здравствуйте.

Код: <service>
<number>2</number>
<name>domain.ru</name>
<type>ns</type>
<state>делегирован</state>
<sid>SID425986</sid>
<paidTill>01.11.2009</paidTill>
</service>
Автор: Cheery
Дата сообщения: 30.03.2009 01:20
ForposT_ForeveR
http://us2.php.net/manual/ru/function.xml-parse-into-struct.php
Автор: brabus9
Дата сообщения: 03.04.2009 22:32
Нужно вырезать из текста ссылки в которых нет параметра href, тоесть:


Цитата:
<a style="...">текст</a>, <a name="...">текст</a>

- вырезать, текст оставить, а ссылки

Цитата:
<a href="...">текст</a> <a style="..." href="">текст</a>, <a href="" style="...">текст</a>, <a style="..." href="..." name="...">текст</a>

- оставить,

например так:


Цитата:
function a_con($matches) {return ($matches[4]);}
$file=preg_replace_callback("|(<a(?:href)*?>(.*?)(</a>)|i","a_con",$file);



тоесть <a(?:href)*?> тут надо сделать что-то типа группа элемента начинающая на <a и заканчивающаяся первым вхождением >, не включая строку href.
Автор: Cheery
Дата сообщения: 04.04.2009 00:35
brabus9
можно и без callback, но лень думать

Код: echo (preg_replace_callback("/<a(.*)>(.*)<\/a>/iUs","check",$str));
function check($str)
{
return !eregi('href',$str[1])?$str[2]:$str[0];
}
Автор: Rick_Ross
Дата сообщения: 04.04.2009 21:56
Помогите пожалуйста с выражением, есть строка

Код: 123/img001.jpg
Автор: Cheery
Дата сообщения: 04.04.2009 22:07
Rick_Ross
чтобы не возиться с регулярками. если php выше 5.2, то
www.php.net/pathinfo
элемент filename возвращаемого массива

иначе
preg_replace("/(.*)\/(.*)\..*$/iU","$2",$str);
Автор: Rick_Ross
Дата сообщения: 04.04.2009 23:37
Огромное спасибо! Выбрал первый способ!
Автор: brabus9
Дата сообщения: 11.04.2009 05:05

Цитата:
echo (preg_replace_callback("/<a(.*)>(.*)<\/a>/iUs","check",$str));
function check($str)
{
return !eregi('href',$str[1])?$str[2]:$str[0];
}

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

Цитата:

function check($matches)
        {return (!eregi('href',$matches[1])?$matches[2]:$matches[0]);}
$file=preg_replace_callback("|(<a[^>]*>)([^<]*)(<\/a>)|i","check",$file);

Автор: Cheery
Дата сообщения: 11.04.2009 05:15
brabus9

Цитата:
только правильнее было бы

ну почему.. когда стоит модификатор U, то остановится до первого >, так что какой смысл?
аналогично с обратным
это тоже самое, как и писать .*?
а перенос строки уже включил модификатором s
так что это одно и то же
Автор: brabus9
Дата сообщения: 11.04.2009 09:19
понятно, буду знать, спасибо)) кстати не скажешь хороших учебников по PCRE в нете?
Автор: Cheery
Дата сообщения: 11.04.2009 18:39
brabus9

Цитата:
кстати не скажешь хороших учебников по PCRE в нете?

http://us2.php.net/manual/en/pcre.pattern.php
Автор: brabus9
Дата сообщения: 19.04.2009 20:28
Извени забыл, про тему.
Нужно вырезать атрибуты тега в строке,
например в

Цитата:
alt="" src="index.gif" width="150"
вырезал
Цитата:
width="150"
, а остальное оставил кроме указанных,
делал так:

Цитата:
$str=preg_replace("(?<=style|href|name|alt|src)=\"(.*?)\"/i","",$str);


тут он вырезает так

Цитата:
alt src width="150"


но вот что-то не то делает, так-же пробовал:

Цитата:
$str=preg_replace("(?<!style|href|name|alt|src)=\"(.*?)\"/i","",$str);
$str=preg_replace("(?=style|href|name|alt|src)=\"(.*?)\"/i","",$str);
$str=preg_replace("(?!style|href|name|alt|src)=\"(.*?)\"/i","",$str);

тоже не помогает

кажется тут нужно два утверждения

Цитата:
(?<=соответсвующее шаблону)(?<!style|href|name|alt|src)



Автор: pchelovod
Дата сообщения: 24.04.2009 22:14
проблема с выделением ссылок на странице
нужно выделить все ссылки типа:
<a href="link">bla-bla-bla</a>
<a href='link'>bla-bla-bla</a>
<a target='_BLANK' href="link">bla-bla-bla</a>
<a href="link" target='_BLANK'>bla-bla-bla</a>
http://link
www.link

т.е. ссылка может быть определена хтмлом, а может и нет.

сейчас использую:

Код:
preg_match_all("/[\s>](\w+:\/\/)([^\s<]+)/",$msg['body'],$links);
Автор: DySprozin
Дата сообщения: 25.04.2009 01:44
Как-то так:

Код:
<?
$a=join('',file("1.txt"));
//Для двойных кавычек:
preg_match_all("/<a [^>]*href=[\"]([^\"]*)[\"]>([^<]*)<\/a>/sU",$a,$out);
//Для одинарных кавычек:
preg_match_all("/<a [^>]*href=[\']([^']*)[\']>([^<]*)<\/a>/sU",$a,$out2);
//Для неопределенных ссылок:
preg_match_all("/(www\.[\S]*)($|[\s])/sU",$a,$out3);
preg_match_all("/(http:[\S]*)($|[\s])/sU",$a,$out4);

echo $out[1][0].":".$out[2][0]; //Выведет: link:bla-bla-bla
echo $out2[1][0].":".$out2[2][0]; //Выведет: link:bla-bla-bla
echo $out3[1][0]; //Выведет: www.link
echo $out4[1][0]; //Выведет: http://link
?>
Автор: Andrey_Wlodimirovich
Дата сообщения: 30.04.2009 15:16
Ребята, нужна помощь в работе с рекуррентными структурами т.е. когда нужно учитывать вложенность элементов при замене. Одними регулярками тут не обойтись, логику проверки вложенности нужно писать нa php, помогите с алгоритмом (или примером ).

Например:

Код: <span style="color: red;">цветной текст <span style="font-size: 16px;">большой текст</span>цветной текст</span>
Автор: EGORR_TOO
Дата сообщения: 02.05.2009 12:16
Научите. кто знает, как callback функции функции preg_replace_callback скормить второй аргумент, не полученный в ходе работы функции preg_replace_callback.
Подробней...
Есть файл со схемой расположения мест туристического автобуса (html таблица).
Номера мест обозначены в таблице в виде {1},{2},{3},{4},{5},....{48}.
Задача забрать значение внутри скобок, проверить в БД статус места (занято, свободно, бронь, служебное) и заменить на DIV с соответствующим статусу классом CSS.
Мне показалось, что наиболее подойдет preg_replace_callback.
Родил шаблон замены

Код: $pattern ='/(\{)(\d+)(})/';
Автор: alex00
Дата сообщения: 02.05.2009 13:06
global $arr; нужно запихнуть и внутри function Replace($matches, $arr)
Автор: EGORR_TOO
Дата сообщения: 02.05.2009 15:04
Я попробовал.
Определил $arr как global и внутри функции Replace().
И странное дело сотворилось: аргумент $arr был принят, но перед отрисовкой схемы(собственно результат работы всего этого огорода) сервер выдает пердюпреждение

Цитата:
Warning: Missing argument 2 for Replace()

Если аргумент потерян, то как же рисуется таблица?
Я для простоты и наглядности упростил(временно)Replace()

Код: global $arr;
$arr = "-- ";

function Replace($matches, $arr)
{
global $arr;
return "<div>".$arr.$matches[2]."</div>";
}
Автор: Cheery
Дата сообщения: 02.05.2009 19:25
EGORR_TOO

Цитата:
Я что-то ничего понять не могу. Зачем он ругается, если аргумент использует?

он его не использует. глобальная вещь переопределяет
уберите второй аргумент из определения функции
Автор: EGORR_TOO
Дата сообщения: 02.05.2009 20:56
Так просто!!
Теперь все ясно.
Расшифрую для тех, кто станет читать...
Незачем передавать в функцию то, что она может взять из массива GLOBAL. Она оттуда и брала. Поэтому и шла замена. А второй аргумент она не могла принять, отсюда и ругательный Warning.
все встало на свои места.
Слава PHP! Великому и Могучему!
Спасибо Cheery!
Автор: ForposT_ForeveR
Дата сообщения: 03.05.2009 12:26
Здравствуйте.
Подскажите пожалуйста, как спарсить ссылки, на странице $url, точнее значения тега
<a href=/lala/1>tra la la</a>. Спарсить именно те хрефы, которые в ссылке содержат слово 'lala'.
Заранее спасибо.
Автор: EGORR_TOO
Дата сообщения: 03.05.2009 14:33
ForposT_ForeveR, ты уже как-то пытался это сделать?
Цитата из правил:

Цитата:
Когда задаете вопрос, укажите с самого начала, что вы все это уже сделали; это поможет понять, что вы не какой-нибудь лентяй, транжирящий чужое время.

Приведи код.

Страницы: 12345678910111213141516171819202122232425262728293031323334

Предыдущая тема: Xitami Web Server + PHP+ zend optimizer


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.