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

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

Автор: tolyn77
Дата сообщения: 12.12.2011 06:39
duhon
что то блин совсем запутался
"У вас ошибка в запросе. Изучите документацию по используемой версии MySQL на предмет корректного синтаксиса около 'a\'a\'b\'b\'''' на строке 1"
Автор: duhon
Дата сообщения: 12.12.2011 14:16
попробуй оставить только это preg_replace('/["\']/',""", 'aabb');
Автор: holden321
Дата сообщения: 20.12.2011 15:30
нужно перебрать из html все тэги tr внутри которых втречается определенная строка
текст может находиться где угодно включая атрибуты какого-либо элемента и т.д.
подскажите как сделать

в php все это происходит
Автор: DarkSmoke
Дата сообщения: 01.01.2012 22:40
Мучаюсь ужасно.
Нужно удалить из текста первый абзац, т.е. от <p> до </p>.


Цитата:
<p><img alt="" src="/companyLogo/akva-lux.png" 170px; height: 170px;" /></p>
<p>В основе управления бизнесом лежит разработка стратегии, ее адаптация к специфике компании и реализация. Стратегия компании — это комплексный план управления, который должен укрепить положение компании на рынке и обеспечить координацию усилий, привлечение и удовлетворение потребителей, успешную конкуренцию и достижение глобальных целей. Процесс выработки стратегии основывается на тщательном изучении всех возможных направлений развития и деятельности и заключается в выборе общего направления, осваиваемых рынков, обслуживаемых потребностей, методов конкуренции, привлекаемых ресурсов и моделей бизнеса. Другими словами, стратегия означает выбор компанией пути развития, рынков, методов конкуренции и ведения бизнеса.</p>

делаю так

Код: ereg_replace("(<p>)(.*)(<\/p>)",'',$this->input->post('redactor_content'));
Автор: Cheery
Дата сообщения: 02.01.2012 02:30
DarkSmoke

Цитата:
"(<p>)(.*?)(<\/p>)"

ps: ereg_replace с 5.3 уже deprecated
использование его нежелательно, так как в будущих версиях php от этой функции откажутся.

хотя нет, это не поможет..
используйте preg_replace - там есть ограничение на количество совпадений
Автор: duhon
Дата сообщения: 12.01.2012 10:57
попробуй так
preg_replace('/<p>.*?<\/p>/', '', $in_text);
Автор: d1200
Дата сообщения: 13.01.2012 16:34
Люди добрые, помогите, плиз. Пол дня мучаюсь, пытаясь понять регекспы.
А нужна-то фигня полная: найти ссылки в html вида href="ссылка" и заменить на href="домен/ссылка", при условии, что не указан домен.

Никак не могу понять как сделать !="http"
Где функция отрицания в регулярных выражениях?


Заранее благодарю за помощь
Автор: DrakonHaSh
Дата сообщения: 14.01.2012 18:07
d1200

Цитата:

Люди добрые, помогите, плиз. Пол дня мучаюсь, пытаясь понять регекспы.
А нужна-то фигня полная: найти ссылки в html вида href="ссылка" и заменить на href="домен/ссылка", при условии, что не указан домен.

Никак не могу понять как сделать !="http"
Где функция отрицания в регулярных выражениях?

единственное отрицание в регулярках это не содержание множества элементов в одном символе [^abc]
четкое отрицание на 2 и более подряд идущих элемента [например "не ht"] сделать, насколько я знаю, нельзя.

вашу задачу можно решить такой регуляркой:
href="(.{0,4}|.{4}[^:][^"]*)"


.{4}[^:][^"]* -> (4 что угодно)+(один не : )+(сколько угодно не ") [используем факт того, что "http://" 5-м символом имеет ":" ]
.{0,4} -> 0..4 любых символа [для того чтоб попали маленькие ссылки в которых менее 5 символов]

этот вариант:
href="(.{0,4}|.{4}[^:][^"]*|.{0,4}[?#]+.{0,4}:.*)"
учитывает экзотические варианты ссылок вида
href="1?a=:X" и href="1#xa:1"
Автор: Cheery
Дата сообщения: 15.01.2012 05:04
d1200
например так

Код: $test='<a href="/text">link</a> and another <a href="http://www.site">link2</a>';
echo preg_replace('/(href=[\'"])(?!https?:)/i', '\\1http://www.мой_сайт.ru', $test);
Автор: DrakonHaSh
Дата сообщения: 15.01.2012 13:34

Цитата:
(?!https?:)

о, КРУТО !!!! не знал про Негативный просмотр вперёд (с отрицанием)
жаль что не везде поддерживается. [в ТС 756a и парочке редакторов (кроме akelpad+SearchReplace.js), что проверил, не поддерживается]
Автор: Cheery
Дата сообщения: 15.01.2012 20:37
DrakonHaSh
здесь речь о php, а не возможностях редакторов.
у редакторов, обычно, более ограниченные регулярки
Автор: d1200
Дата сообщения: 16.01.2012 10:57
DrakonHaSh, Cheery, Спасибо за помощь!

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

Автор: Spy686
Дата сообщения: 05.02.2012 18:56
записываем список ссылок форумов, например:

http://forum.onliner.by/viewtopic.php?t=3795376
http://forum.onliner.by/viewtopic.php?t=3795376&start=20
http://forum.onliner.by/viewtopic.php?t=3795376&start=40

вытягиваем html, например:
находиться тут - view-source:http://forum.onliner.by/viewtopic.php?t=3795376

удаляем все кроме того что заключено в теги :
<div class="content" id="message_ЛЮБОЕ ЧИСЛО"
</div>

удаляем из оставшегося все что заключено в теги :
<img
/>

удаляем из оставшегося все что заключено в теги :
<blockquote
</blockquote>

удаляем из оставшегося все что заключено в теги (закрывающий должен быть с запятой) :
<strong
</strong>,

удаляем:
p>

удаляем:
<br />

удаляем все оставшиеся теги (strong, em, <img ... />, <a ... >, </a> и др.) и мусор от тегов (>,<,/,):

на выходе получаем .txt-файл :

Барахолку Onliner.by любят и ценят: около ста тысяч человек посещают её ежедневно. Теперь мы делаем этот супер-популярный раздел еще удобнее для всех, кто хочет продать или купить автомобиль.
!-- u --AB.ONLINER.BY!-- u --
Что интересного в новой Автобарахолке:
- Совершенно новый сервис, который теперь находится в разделе Авто.
- Простота и быстрота подачи объявления. Вы указываете только самое важное. При желании вы всегда можете расширить информацию об авто добавив, например, Carfax или полный список опций. Приглашаем официальных дилеров и автохаусы.
- Теперь поиск работает в режиме реального времени! Всего пару кликов и у вас есть список кандидатов на покупку, которые соответствуют вашим требованиям.
- В объявления лекго добавить много фотографий хорошего разрешения и также легко их потом просмотреть. Рассмотрите машину в мельчайших деталях!
- Все лучшее из оригинальной барахолки. UP'ы и горячие комментарии к объявлениям. Задайте вопрос продавцу &quot;не отходя от кассы&quot; или обсудите классную тачку!
Мы немного поработаем в тестовом режиме, чтобы отловить все ошибки и учесть ваши ценные замечания и постепенно старая Автобарахолка
переместится на новый сервис.
Если вам есть что продать и вы разместили ваше объявление в обычной барахолке - не теряйте время и добавьте его в новую Автобарахолку прямо сейчас, внимание к первым предложениям будет огромное!
Предложения, пожелания и конструктивная критика приветствуются.
в последней опере выпадающий список выбора марки авто дергается при раскрытии.
Поздравляем!
отлично сделано. онлайнер, утопим ав и абв
возможность редактировать комментарий будет?
Зашел и охренел какие там тачки &quot;продают&quot;. Думал что может с автосалоном в Дубае перепутал Только потом дошло, что там на 99% фейк забит

А мы щас поправим как раз.
хорош!
Но почему всё-же поддомен не av.onliner.by ?


как твкое осуществить ?
Автор: Spy686
Дата сообщения: 07.02.2012 23:46
есть успехи

<?php
$content = file_get_contents('http://forum.onliner.by/viewtopic.php?t=3795376'); //вытягиваем html
preg_match_all("#<div class=\"content\" id=\"message_+.*?</div>#is", $content, $tables); //удаляем все кроме того что заключено в теги : <div class="content" d="message_ЛЮБОЕ ЧИСЛО" </div>
print_r($tables[0]);
?>


две первых задачи выполнены :

1. вытягиваем html, например:
находиться тут - view-source:http://forum.onliner.by/viewtopic.php?t=3795376

2. удаляем все кроме того что заключено в теги :
<div class="content" id="message_ЛЮБОЕ ЧИСЛО"
</div>

но это все пронумеровано :
Предложения, пожелания и конструктивная критика приветствуются.

[1] =>
в последней опере выпадающий список выбора марки авто дергается при раскрытии.

[2] =>
Поздравляем!

[3] =>

как сделать так что бы не нумеровалось ?

и еще в конце лишняя скобка ")" какаята, хотя её после последнего </div> нету ?
Автор: Spy686
Дата сообщения: 08.02.2012 13:00
есть ответ


<?php
$content = file_get_contents('http://forum.onliner.by/viewtopic.php?t=3795376'); //вытягиваем html
preg_match_all("#<div class=\"content\" id=\"message_+.*?</div>#is", $content, $tables); //удаляем все кроме того что заключено в теги : <div class="content" d="message_ЛЮБОЕ ЧИСЛО" </div>
foreach($tables[0] as $value)
{ echo $value; }
?>
Автор: israel_rider
Дата сообщения: 22.03.2012 10:35
Прошу прощения за небольшую предысторию.
Написал коллеге по работе письмо следующего содержания:

Can you to help me to improve my Reg Ex?

For most clarity, please run –
<?php

header('Content-Type: text/plain');

$pattern ='/<a\s[^>]*href\s*=\s*([\"\']??)([^\">]*?(&page=\d)|[^\" >]*?)\\1[^>]*>(.*)<\/a>/siU';

$subject = '<a href="http://test.domain.kvet/blogtest3/?p=31&page=2">2</a>';
preg_match($pattern, $subject, $matches);
print_r($matches);

$subject = '<a href="http://test.domain.kvet/blogtest3/?p=31">2</a>';
preg_match($pattern, $subject, $matches);
print_r($matches);

As you can see, it run very fine for now, but I do not sure, if the part –

([^\" >]*?(&page=\d)|[^\">]*?)

is best way for it…

Do you think, it possible to improve the part

([^\" >]*?(&page=\d)|[^\">]*?)

?

На что коллега ответил: Сan you please explain what it is you are trying to do and what do you need help with?

Короче, блин, я хренею, разговор немого с глухим! А мне так показалось, что всё было чётко объяснено. Но, видимо это не так, поэтому, задаю тот же вопрос по русски.

Как видно из выше приведённого кода, я получаю href из html ссылки. Причём, если в QUERY_STRING присутствует строка &page=\d , то мне необходимо получить эту строку в отдельный элемент массива $matches, а если эта строка отсутствует в QUERY_STRING, то тогда в этом элементе должна оказаться пустая строка ''.
Чего я и добиваюсь при помощи части ([^\" >]*?(&page=\d)|[^\">]*?) , всё работает нормально, но вот вопрос, я опасаюсь, что способ ([^\" >]*?(&page=\d)|[^\">]*?) несколько неуклюж. Вот я и хочу спросить, существует ли более оптимальный способ?

Спасибо.
Автор: Cheery
Дата сообщения: 22.03.2012 21:09
israel_rider

Цитата:
А мне так показалось, что всё было чётко объяснено.

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


Цитата:
(&page=\d)

а если там 2 и более цифры?

Цитата:
[^\" >]

а если кавычки одинарные?


Цитата:
&page

а если в адресе идет сразу '/?page=2' ?
Автор: israel_rider
Дата сообщения: 22.03.2012 22:12
Cherry, огромное спасибо за Ваши замечания, надо же… не учёл.

Цитата:
а если кавычки одинарные?

Честно говоря, само выражение писал не я, пусть уж это останется на совести писавшего. Допустим, почему после
[\"\']
Стоит
?? .
Ну второй знак вопроса понятно – лечит от жадности. А первый?
При помощи
[\"\']??
мы хотим определить кавычки, обрамляющие URL в атрибуте href ссылки HTML. Но кавычки должны быть обязательно, href без кавычек – это очень старый стандарт, и не встречается уже ни где вообще. А квантификатор ? обозначает ноль или один.
Далее, при помощи
[^\">]
мы хотим исключить символы, которые запрещены в атрибуте href . Но таких символов может быть несколько, не одни только кавычки. Уж проще перечислить символы, которые имею право там быть.
И почему после группы [^\">] квантификатор – звёздочка? Звёздочка – это ноль или сколько угодно. Но URL не может состоять из нуля символов, следовательно там должен быть квантификатор – плюс.

Цитата:
а если в адресе идет сразу '/?page=2' ?

Вообще то, этого быть не может, поскольку регулярное выражение изменено мною с одной специфической целью – что бы продукт нашей фирмы поддерживал следующую фичу - Styling Page-Links http://codex.wordpress.org/Styling_Page-Links .
Но, тогда, просто из любви к искусству, переписал:

<?php

header('Content-Type: text/plain');

$pattern ='/<a\s[^>]*href\s*=\s*([\"\']??)([^\">]*?([\?&]page=\d+?)[^\">]*?|[^\" >]*?)\\1[^>]*>(.*)<\/a>/siU';

$subject = '<a href=\'http://test.domain.kvet/blogtest3/?page=20&p=31\'>2</a>';
preg_match($pattern, $subject, $matches);
print_r($matches);

$subject = '<a href=\'http://test.domain.kvet/blogtest3/?p=31\'>2</a>';
preg_match($pattern, $subject, $matches);
print_r($matches);

Цитата:
а если там 2 и более цифры?

С учётом Вашего замечания, вот окончательный результат –
<?php

header('Content-Type: text/plain');

$pattern ='/<a\s[^>]*href\s*=\s*([\"\']??)([^\">]*?(&page=\d+?)|[^\" >]*?)\\1[^>]*>(.*)<\/a>/siU';

$subject = '<a href="http://test.domain.kvet/blogtest3/?p=31&page=20">2</a>';
preg_match($pattern, $subject, $matches);
print_r($matches);

$subject = '<a href="http://test.domain.kvet/blogtest3/?p=31">2</a>';
preg_match($pattern, $subject, $matches);
print_r($matches);
Автор: Spy686
Дата сообщения: 24.03.2012 22:23
допустим есть такое:

message_35936118"><blockquote class="uncited"><cite>SPzzz:</cite>
<p> spy686@gmail.com в чем вопрос ? заберут так же, как не студента. разница в том, что проще вручить повестку. насчет продолжения учебы и нюансов вроде призыва посреди сессии не знаю. на всякий случай:
</p></blockquote>
<p> Волнует продолжение учебы, а так же призыв посреди семестра.</p>
message_35937211"><p>В законе о военской собязанности и воинской службе сказано<br />
Статья 32. Отсрочка от призыва граждан на срочную военную службу, службу в резерве<br />

надо удалить :

message_35936118">, а вернее:все вот эти куски: message * ">
Автор: Cheery
Дата сообщения: 24.03.2012 22:24
Spy686
$str = preg_replace('/message_\d+">/i', '', $str);
Автор: Spy686
Дата сообщения: 25.03.2012 16:04

Цитата:
допустим есть такое:
 
message_35936118"><blockquote class="uncited"><cite>SPzzz:</cite>
<p> spy686@gmail.com в чем вопрос ? заберут так же, как не студента. разница в том, что проще вручить повестку. насчет продолжения учебы и нюансов вроде призыва посреди сессии не знаю. на всякий случай:
</p></blockquote>
<p> Волнует продолжение учебы, а так же призыв посреди семестра.</p>
message_35937211"><p>В законе о военской собязанности и воинской службе сказано<br />
<blockquote class="uncited"><cite>SPzzz:</cite>
<p> ПриУед Новый год
</p></blockquote>
Статья 32. Отсрочка от призыва граждан на срочную военную службу, службу в резерве<br />





надо удалить:

<blockquote *</blockquote>
Автор: Cheery
Дата сообщения: 25.03.2012 22:56
Spy686
а может почитаете о регулярках ?) там ничего, в принципе, сложного нет.

Цитата:
<blockquote *</blockquote>

вы уже почти и написали, в принципе. если речь идет именно об удалении всего между тегами blockquote, включая их самих.
/<blockquote.*?<\/blockquote>/s
Автор: Tstf
Дата сообщения: 27.03.2012 19:00
Есть строка

Перфоратор Vertex VR-1403"

Раньше было такое условие

            $good_array [$key] [4] = trim ( preg_replace ( "/[^a-zA-Z0-9а-яА-ЯёЁ\_\-]+/mi", " ", $match [0] [0] ) );

Сейчас из-за того, что строка стала приходить в UTF-8 переделал регулярку в такое

$good_array [$key] [4] = trim(mb_ereg_replace ( "/[^a-zA-Z0-9а-яА-ЯёЁ\_\-]+", " ", $match [0] [0] ));

Что я не так делаю?
На конце знак кавычек не убирается.
Автор: Cheery
Дата сообщения: 27.03.2012 19:01
Tstf

Цитата:
$good_array [$key] [4] = trim(mb_ereg_replace  ( "/[^a-zA-Z0-9а-яА-ЯёЁ\_\-]+", " ", $match [0] [0] ));

уверены? потому что тут ошибка.


Цитата:
На конце знак кавычек не убирается.

на каком "конце"? пример покажите
Автор: Tstf
Дата сообщения: 27.03.2012 19:21
Вот

Перфоратор Vertex VR-1403"


Код: $good_array [$key] [4] = trim(mb_ereg_replace ( "/[^a-zA-Z0-9а-яА-ЯёЁ\_\-]+", " ", $match [0] [0] ));
Автор: Cheery
Дата сообщения: 27.03.2012 19:49
Tstf

Цитата:
Какая ошибка?

нет, просто забыл насчет синтаксиса ereg
но она и приводит к тому, что замены нет


Цитата:
/[^a-zA-Z0-9а-яА-ЯёЁ\_\-]+

означает заменить кусок, который начинается с / и не включает символы из квадратных скобок
Автор: Tstf
Дата сообщения: 27.03.2012 19:56
Запутался... Окей, задам вопрос так

Есть фраза

Перфоратор Vertex VR-1403"

Хочу из неё убрать символ " на конце и в итоге должнополучится

Перфоратор Vertex VR-1403

Надо все сделать через функцию mb_ereg_replace дабы работало с UTF

Что надо прописать?
Автор: Cheery
Дата сообщения: 27.03.2012 20:07
Tstf

Цитата:
Что надо прописать?

убрать / из кода ранее
Автор: Tstf
Дата сообщения: 27.03.2012 20:32
Сделал строку
$good_array [$key] [4] = trim(mb_ereg_replace ( "[^a-zA-Z0-9а-яА-ЯёЁ\_\-]+", " ", $match [0] [0] ));

Теперь проблема с кодировкой

&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533; Vertex VR-1403
Автор: Cheery
Дата сообщения: 28.03.2012 20:29
Tstf

Цитата:
&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;

http://www.fileformat.info/info/unicode/char/fffd/index.htm
код скрипта в уникоде вообще написан? или регулярка в одной кодировке, а содержимое переменной в другой?

через обычный preg_replace с флагом u пробовали?

Страницы: 12345678910111213141516171819202122232425262728293031323334

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


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