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

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

Автор: andead
Дата сообщения: 15.04.2008 20:57
DeADMoHAX

Код: $word='Hello';
$link='Happy';
print (preg_replace("/($word)([\s[:punct:]])/",$link . '$2','Hello! Hello, Helloworld'));
Автор: DeADMoHAX
Дата сообщения: 15.04.2008 21:56
andead
спасибо, даже странно что сам не додумался
Автор: Delphi6
Дата сообщения: 16.04.2008 05:25
andead

Цитата:
$word='Hello';
$link='Happy';
print (preg_replace("/($word)([\s[:punct:]])/",$link . '$2','Hello! Hello, Helloworld'));

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

Цитата:
print (preg_replace("/(?:$word)([\s[:punct:]])/",$link . '$1','Hello! Hello, Helloworld'));

или совсем без него

Цитата:
print (preg_replace("/$word([\s[:punct:]])/", $link.'$1', 'Hello! Hello, Helloworld'));

И что за аббревиатура :punct:, смотрел на php.net но не нашел
Автор: Brodyaga
Дата сообщения: 16.04.2008 06:13
Delphi6
Это POSIX'овый класс символов, есть ещё digit, alpha и другие.
Автор: andead
Дата сообщения: 16.04.2008 06:21

Цитата:
И что за аббревиатура unct:, смотрел на php.net но не нашел

это наследие POSIX-a, в вики есть список этих диапазонов - http://ru.wikipedia.org/wiki/Регулярные_выражения
думаю на первый вопрос теперь сами ответите =)
Автор: Delphi6
Дата сообщения: 16.04.2008 07:01
Brodyaga, andead

Цитата:
Это POSIX'овый класс символов

Теперь понятно что значит эти аббревиатуры Спасибо за линк, начну тоже их использовать

Что же касается первого вопроса то теперь понятно, я просто не заметил что там не просто указано что после ключа идет "пустой" символ $word(\s...), а перечень возможных символов $word([\s...]) .
Автор: kpg12
Дата сообщения: 02.05.2008 19:17
Нужно выдернуть значение value и ТЕКСТ
из:
<option value="1">ТЕКСТ</option>
<option value="2">ТЕКСТ</option>
<option value="3">ТЕКСТ</option>
<option value="4">ТЕКСТ</option>
<option value="5">ТЕКСТ</option>

(этот HTML затянут в $message с помощью CURL)

пробую получить хоть что-то, так:
$start = '/<option value="(\d+)">(.*?)<\/option>/';
preg_match_all($start, $message, $matches);
for ($i=0; $i< count($matches); $i++) {
echo $matches[0]."<br>";
}

получаю:
Array
Array
Array

как правильно сделать? Хотелось бы чтобы выводило:
1
ТЕКСТ
2
ТЕКСТ
....
Автор: Delphi6
Дата сообщения: 02.05.2008 21:32
kpg12
Это уже вопрос синтаксиса а не регулярных выражения Надо было написать:

Цитата:
preg_match_all($start, $message, $matches, PREG_SET_ORDER);
foreach ($matches as $match) {
echo $match[1]."<br>".$match[2]."<br>";
}
Автор: kpg12
Дата сообщения: 02.05.2008 23:07
спасибо за ответ,
я извиняюсь, но если пишу так:

Цитата:
preg_match_all($starts, $message, $matches[1 или 0]);
foreach ($matches as $match) {
echo $match[1]."<br>".$match[2]."<br>";
}


то получаю на выходе:

Array
Array

я на самом деле уже плохо понимаю что делаю
Автор: Delphi6
Дата сообщения: 02.05.2008 23:15
kpg12
Исходник:

Код: <?php
$message = '
<option value="1">ТЕКСТ</option>
<option value="2">ТЕКСТ</option>
<option value="3">ТЕКСТ</option>
<option value="4">ТЕКСТ</option>
<option value="5">ТЕКСТ</option>
';
$starts = '/<option value="(\d+)">(.*?)<\/option>/';
preg_match_all($starts, $message, $matches, PREG_SET_ORDER);
foreach ($matches as $match) {
echo $match[1]."<br>".$match[2]."<br>";
}
?>
Автор: kpg12
Дата сообщения: 02.05.2008 23:25
Да, так работает.
Видимо при загрузке файла, где-то в регулярных выражениях еще ошибка.
Спасибо, буду копать дальше.


upd: Еще раз спасибо. Проблема была в неправильном затягивании файла.
Автор: Evgen XXX
Дата сообщения: 06.05.2008 12:17
Помогите пожалуйста

Текст:

[more=Текст]
Код: <b style="display:none;" id="checkoffer-b-39334693"><input type="checkbox" checked id="checkoffer-39334693" value="39334693" name="o39334693"><label class="checkoffer" for="checkoffer-39334693">
мимо
</label></b>
</td>
<td>
<div class="category">
<a href="/catalog.xml?hid=91597">Строительство и ремонт</a> / <a href="/catalog.xml?hid=1618974">Инструменты
</a> / <a href="/catalog.xml?hid=91649">Электроинструменты</a> / <a href="/catalog.xml?hid=91650">Дрели</a>

</div>
<div class="name"><a target="_blank" href="http://www.yandex.ru/redir?dtype=market&amp;uid=543259012100527051&amp;categid=895&amp;price=4201&
amp;ext=&amp;hyper_id=949624&amp;hyper_cat_id=91650&amp;pp=7&amp;cp=10&amp;cb=10&amp;cp_ab=0&amp;
ae=0&amp;shop_id=3879&amp;pof=&amp;url=dominstrumenta.ru/product_info.php%3Fproducts_id%3D2929%26from%3
Dymarket&amp;onstock=1&amp;classifier_magic_id=9c88fa9310d987ebde43ee6c436346ad&amp;hash=bnhiendajicpa
bhgddhedfbdnfdmjbilo">ДРЕЛИ УГЛОВЫЕ DeWalt (США) Дрель угловая DeWalt <b><hilite xmlns:xi="http://www.w3.org/2003/XInclude">D</hilite></b> <b><hilite xmlns:xi="http://www.w3.org/2003/XInclude">21160</hilite></b></a></div>
<div class="info">
<span class="price"><span>4 201 р.</span></span> <b>в наличии </b>в <span id="shopnameplaceid39334693" class=""><a target="_blank" class="grey" href="http://www.yandex.ru/redir?dtype=market&amp;uid=543259012100527051&amp;categid=895&amp;price=
4201&amp;ext=&amp;hyper_id=949624&amp;hyper_cat_id=91650&amp;pp=7&amp;cp=10&amp;cb=10&amp;cp_ab
=0&amp;ae=0&amp;shop_id=3879&amp;pof=&amp;url=dominstrumenta.ru/product_info.php%3Fproducts_id%3D292
9%26from%3Dymarket&amp;onstock=1&amp;classifier_magic_id=9c88fa9310d987ebde43ee6c436346ad&amp;hash
=bnhiendajicpabhgddhedfbdnfdmjbilo">Дом Инструмента</a></span> <a href="/review-shop.xml?shop_id=3879" style="text-decoration: none;"><span title=
"оценка качества магазина" style="position: relative; top: 2px;"><img src="/i/star2.gif" border="0" alt="**"></span></a> <a href="/shop-opinions.xml?shop_id=3879&amp;cmid=9c88fa9310d987ebde43ee6c436346ad" class="grey">1 отзыв</a>
<span id="toolbarplaceid39334693" class="MarketMyShopsBarPlace"><a href="#" class="black" id="toolbarplaceid39334693gradelink" onmouseover="return MyShopsBar ? MyShopsBar.thermometer(this,'id39334693','Дом Инструмента','dominstrumenta.ru%2Fproduct_info.php%253Fpr
Автор: andead
Дата сообщения: 07.06.2008 05:04
есть текст:

Код: бла бла бла <a href="qwe/sdfdsf/вап">1</a> бла бла бла
бла бла бла <a href="уке/dfgdfg/апр">2</a> бла бла бла
бла бла бла <a href="апр/people/вап">3</a> бла бла бла
бла бла бла <a href="вап/fghfgh/вап">4</a> бла бла бла
Автор: romeoplus
Дата сообщения: 03.07.2008 21:02
помогите,пожалуйста,поменять ссылки <a href="news.htm"> на полный путь
<a href="http://path/news.htm">,когда $_POST['path']="http://path/".
Автор: andead
Дата сообщения: 03.07.2008 23:04
romeoplus

Код: $replaced = preg_replace('#(.*<a href=")(.*)#isU', '$1http://path/$2', $text);
Автор: romeoplus
Дата сообщения: 04.07.2008 10:53
никак не получается.вот такой скрипт ничего не выводит на экран:
$text='<p><a href="abra.cadabra">';
$rez=preg_replace('#(.*<a\s+href=")(.*)#isU','$1http://aaa/aa/$2',$text);
echo $rez;
Автор: andead
Дата сообщения: 04.07.2008 13:46
romeoplus
а так?

Код: $text='<p><a href="abra.cadabra">+))</a>';
$rez=preg_replace('#(.*<a\s+href=")(.*)#isU','$1http://aaa/aa/$2',$text);
echo $rez;
Автор: romeoplus
Дата сообщения: 04.07.2008 14:14
выводит:
+))
Автор: andead
Дата сообщения: 04.07.2008 22:55
romeoplus
исходный код страницы посматри
Автор: Cheery
Дата сообщения: 04.07.2008 23:00

Цитата:
помогите,пожалуйста,поменять ссылки <a href="news.htm"> на полный путь

$str=str_ireplace('href="','href="'.$path,$str);
Автор: juniormra
Дата сообщения: 08.07.2008 09:21
Кто-нибудь может подсказать в чем проблема?
Значит так, возникла необходимость проверить все письма пришедшие на Return-path:<email>, с темой undelivered, ну или в роде этой и выдернуть оттуда email адреса.
Использовал следующий код: preg_match_all( '/[0-9a-z\._-]{3,15}@[0-9a-z\.-]{3,32}\.[a-z]{2,4}/i', $mail, $emails )
Регулярное выражение, конечно, не идеальное, но должно было бы выдернуть все email адреса.
Но работает, как-то, не стабильно - до того как среди писем были те, которые содержали точку в адресе (.), скрипт выдергивал email-ы вида - name_lastname@anything.com, blah_balh@foo.net.., т.е. те которые содержали символ подчеркивания. Не пойму в чем дело. Пытался использовать другие регулярные выражения, но безрезультатно.
Может проблема заключается в чем-то другом?

Добавлено:
И еще, проверил, что если указать номер письма (где содержатся email-ы, которые обычно не обнаруживаются reg-ex-ом) явно, то reg-ex их обнаруживает.
Вот часть кода:

foreach ($mails as $mail_arr){
    $mail = $pop3->pop3_retr($mail_arr[0]);
    preg_match_all('/[0-9a-z\._-]{3,32}@[0-9a-z\.-]+\.[a-z]{2,4}/i', $mail, $emails);

}

метод pop3_retr() возвращает все письмо в виде простого текста.

Добавлено:
Сорри, нашел проблему.
Регулярка тут не причем, просто, надо было вынести preg_match_all() из цикла и проверить весь текст писем
или же объединять массив $emails с другим массивом... ну или еще как-нибудь
Автор: jadio
Дата сообщения: 15.07.2008 03:04
Здравствуйте.

Имеется код на PHP:

$text = preg_replace('/<a([^>]+)>/i', '<a\\1 rel="nofollow">', $text);

Результат: ко всем ссылкам, содержащимся в $text, добавятся аттрибут rel="nofollow".

Вопрос: помогите, пожалуйста, написать фрагмент кода, который добавит <noindex> в начале и </noindex> в конце к тем ссылкам ссылкам, у которых уже имеется атрибут rel="nofollow".
Автор: Delphi6
Дата сообщения: 15.07.2008 07:34
jadio

Цитата:
Вопрос: помогите, пожалуйста, написать фрагмент кода

Это больше звучит как "сделайте за меня" Надо приводить пример кода который вы пытались для этой цели использовать и у вас не заработал. Ведь вы что хотите получить в результате: просто рабочий код или знания?

Код: $text = preg_replace('#(<a[^>]+rel="nofollow"[^>]*>[^<]*</a>)#i', '<noindex>$1</noindex>', $text);
Автор: jadio
Дата сообщения: 15.07.2008 07:36
Delphi6, спасибо большое.
Автор: dmitro1950
Дата сообщения: 16.07.2008 22:29
Возможно и не в тему. Скачал сайт. В имени страницы вместо символа ? появился символ @ Например:
index.php@productid=385 , а надо index.php?productid=385
Попытался исправить. Но система не дает. Как это исправить?
Автор: Cheery
Дата сообщения: 16.07.2008 22:49
dmitro1950

Цитата:
Но система не дает

какая система??
если операционная, то правильно - в именах файлов не должно быть знаков вопроса.
Автор: dmitro1950
Дата сообщения: 17.07.2008 09:37

Цитата:
какая система??
если операционная, то правильно - в именах файлов не должно быть знаков вопроса.

А как можно изменить? Стоит Windows XPSP2, Апаче , Денвер.
Автор: Cheery
Дата сообщения: 17.07.2008 18:28
dmitro1950

Цитата:
А как можно изменить?

изменить что? разрешить использование символа "?" ?
пишите свою файловую систему (вместе с операционной)
такие символы нельзя использовать в принципе
Автор: dmitro1950
Дата сообщения: 17.07.2008 21:09
Есть сайт, в explorer открывается страница :
http://*.ru/index.php?show_aux_page=2
как мы видим, в строке есть знак "?"
После того, как скачали сайт на локальный диск, то во всех страницах этого сайта появляеться знак "@", например эта же страница выглядит как
http://*.ru/index.php@show_aux_page=2
Теперь, когда мы закачиваем этот сайт на другой хостинг, то он закачивается со знаками "@". В связи с тим и вопрос - как можно заменить "@" на "?"
Автор: Cheery
Дата сообщения: 17.07.2008 21:16
dmitro1950

Цитата:
как мы видим, в строке есть знак "?"

потому что сервер разбирает этот запрос на части и "запускает" файл, который указан до знака вопроса, передав ему параметры, идущие после знакак вопроса.

сама операционная система не поддерживает знаки вопроса в именах файлов.
сколько раз повторять то?

Цитата:
В связи с тим и вопрос - как можно заменить "@" на "?"

никак.. сделать index.php файл, который, в зависимости от аргументов запроса через браузер считывает тот или иной файл с @ в названии файла и выдает его.

Страницы: 12345678910111213141516171819202122232425262728293031323334

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


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