PDA

Просмотр полной версии : [Регулярки & Mod_Rewrite] Задай вопрос, получи ответ.


Страницы : [1] 2 3 4 5

.:EnoT:.
19.11.2008, 02:58
Очень уж много задаётся вопросов по регуляркам и мод_реврайту (набор правил которого и есть регулярные выражения). Дабы уменьшить захламление соседних тем подобными вопросами и уменьшить время поиска нужной регулярки создал эту спец. тему.

В этой специальной теме задаём вопросы по регулярным выражениям и работе Mod_Rewrite


Небольшой FAQ:
Регулярки:
Полезная статья новичкам (рекомендую) (http://pyha.ru/forum/topic/19.0)
База регулярок (http://regexlib.com/)
Регулярки часть 1 (http://phpclub.ru/detail/article/regexp_1)
Регулярки часть 2 (http://phpclub.ru/detail/article/regexp_2)

Mod_Rewrite (ЧПУ)
Рекомендую почитать 2 статьи:
Статья 1 (http://i-novice.net/osmyslennye-linki-i-mod_rewrite/)
Статья 2 (http://i-novice.net/delaem-chpu/)



Отдельно созданные темы, а так же сообщения, связанные с сабжем созданные в других темах будут удаляться.

Chaak
19.11.2008, 09:36
http://www.inattack.ru/article/586.html
Чит-лист регулярных выражений в PHP

biophreak
19.11.2008, 10:08
Ссылки:
http://www.regular-expressions.info/ - Довольно неплохой сайтик по регекспам...есть примеры на разных языках
http://bogambilya.asti.dost.gov.ph/manual/ru/ref.pcre.php - конкретно по пхп
http://regexp.ru/ - тоже довольно полезный сайтик
http://www.pcre.ru/ - Perl Compatible Regular Expressions, есть яваскриптовый "конструктор" и валидатор регекспов
http://myregexp.com/ - опять-же редактор и валидатор регекспов...удобен тем, что есть подсветка синтаксиса ))

А по mod_rewrite(так и по .htaccess и апачу в целом), на мой взгляд, один из самых лучших сайтов это http://apachedev.ru/
To .:EnoT:. : Добавь плиз ссылки в первый пост...полезные...чтоб люди по всему треду не искали, если надо будет )))

bombeg
19.11.2008, 11:18
http://regexlib.com/Default.aspx - домен.

rushter
19.11.2008, 14:50
http://know-how.mc3.telecom.by/SintaksisModRewrite
http://www.intrigue.ru/dump/mod_rewrite.html

barnaki
19.11.2008, 20:38
объясните . почему так.
mysql> SELECT "gheis" REGEXP "^[^a-dXYZ]+$"; -> 1
mysql> SELECT "gheisa" REGEXP "^[^a-dXYZ]+$"; -> 0
какую роль имеет ^ внутри []. и почему впервый раз 1 а второй 0 ? или где про это почитать. а то это из справочника и считается наиболее исчерпывающим объяснением.

Chaak
19.11.2008, 20:39
объясните . почему так.
mysql> SELECT "gheis" REGEXP "^[^a-dXYZ]+$"; -> 1
mysql> SELECT "gheisa" REGEXP "^[^a-dXYZ]+$"; -> 0
какую роль имеет ^ внутри []. и почему впервый раз 1 а второй 0 ? или где про это почитать. а то это из справочника и считается наиболее исчерпывающим объяснением.
Имеет роль отрицания. Т.е все символы кроме a-dXYZ. :rolleyes: А снаружи - начало строки.

kik8888
20.11.2008, 13:19
При использовании mod_rewrite нужно ли в коде скрипта заменять ссылки стандартного вида на мод_реврайтовские? Или он сам их будет преобразовывать и выдавать как надо?

[:|||||:]
20.11.2008, 13:21
http://forum.antichat.ru/thread92492.html

swt1
20.11.2008, 14:17
При использовании mod_rewrite нужно ли в коде скрипта заменять ссылки стандартного вида на мод_реврайтовские? Или он сам их будет преобразовывать и выдавать как надо?
заменить.
http://forum.antichat.ru/thread92492.html

[x26]VOLAND
20.11.2008, 16:43
http://s54.radikal.ru/i144/0811/ec/798acf0c466bt.jpg (http://radikal.ru/F/s54.radikal.ru/i144/0811/ec/798acf0c466b.png.html)

Корвин
20.11.2008, 17:44
помогите, у мну проблема, вот этот реврайт на хостинге рбк(hc.ru) работает а на nic.ru не пашет

RewriteEngine on

RewriteCond %{REQUEST_URI} !(\.|/$)
RewriteRule (.*) /$1/ [R=301,L]

RewriteRule ^atomax/ /modules/core/atomax/ [R,L] - эта строчка не срабатывает
RewriteRule ^modules/ - [L]
RewriteRule ^cachetime/ - [L]
RewriteRule ^cache/ - [L]
RewriteRule ^db_backup/ - [L]
RewriteRule ^csv_parser/ - [L]


RewriteRule ^(.*\/)*$ content.php [PT]

RewriteRule ^(.*\.html)*$ content.php [PT]

PS модуль реврайт включен, проверял

biophreak
20.11.2008, 19:18
В логах не пишет ничего?
В логах апача, я имею в виду

Pashkela
20.11.2008, 20:06
А точно " /modules/core/atomax/" остался там, где был на рбк(hc.ru)? Проверь пути в смысле относительно корня сайта там и здесь - и почуствуй разницу

!{ra!{e/\/
20.11.2008, 22:48
Помогите с регуляркой)
Как со страницы http://musicnote.ru/dir/2/ отпарсить исполнителей
Пробывал так
/<td class=\"artist\"><a href=\"([a-zA-Z0-9\/]*)\">([a-zA-Zа-яА-Я0-9]*)<\/a><\/td>/isU
Не помогает(

Chaak
20.11.2008, 22:53
Помогите с регуляркой)
Как со страницы http://musicnote.ru/dir/2/ отпарсить исполнителей
Пробывал так
/<td class=\"artist\"><a href=\"([a-zA-Z0-9\/]*)\">([a-zA-Zа-яА-Я0-9]*)<\/a><\/td>/isU
Не помогает(
preg_match_all('#<td class\="artist"><a href\="/dir/2/[0-9]+/">(.*?)</a></td>#UiS',$parse,$res);

Твоя не работает из-за A-Я. Может быть проблема с кодировкой UTF-8 != CP-1251

!{ra!{e/\/
20.11.2008, 22:58
preg_match_all('#<td class\="artist"><a href\="/dir/2/[0-9]+/">(.*?)</a></td>#UiS',$parse,$res);
А если еще и ссылку и исполнителя и почему мой не работает?

Ant1Player
21.11.2008, 18:47
Подскажите новичку как сделать так:
есть странница(доступа к коду нет) на страницы вот ето "текст(число)"
как сделать чтоб ето число считывалось и выводилось на другой страницы

Ru}{eeZ
21.11.2008, 19:04
Подскажите новичку как сделать так:
есть странница(доступа к коду нет) на страницы вот ето "текст(число)"
как сделать чтоб ето число считывалось и выводилось на другой страницы

preg_match_all('/[a-z0-9а-яё]+\([0-9]+\)/i', $page, $result);

что-то типа этого

Ant1Player
21.11.2008, 19:26
не ну если я так исчу например FLY он выводит
Array ( [0] => Array ( FLY ) )
а как сделать чтоб он просто выводил FLY ?

Pashkela
21.11.2008, 19:48
echo $result[0];

Ant1Player
21.11.2008, 19:59
терь просто выводит Array =(

Pashkela
21.11.2008, 20:07
а потому что echo надо делать до, а не после. Выложи код полностью

Ant1Player
21.11.2008, 20:10
<?php
$page = "FLYER";
preg_match_all('/FLY/', $page, $result);
// Производим поиск
echo $result[0];
?>
ну ет типо примера какбы (без страницы)

Pashkela
21.11.2008, 20:19
<?php
$page = "FLYER";
preg_match('/FLY/' ,$page, $result);
// Производим поиск
echo $result[0];
?>


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

Ant1Player
21.11.2008, 20:28
короче есть страницы тык (http://samp-rus.com/index/8-792)
на ней в низу написано форум(150)
вот надо чтоб ети циферки считывались и выводились на тургой страницы(которую я пытаюсь сделать=))

Pashkela
21.11.2008, 20:36
<?php
$t=array();
$responce = "<a href='http://samp-rus.com/forum/0-0-1-3-792' target='_blank'>форум(<b>150</b>)</a>";
$patern = "|<[^>]+>(.*)</[^>]+>|U";
preg_match($patern, $responce, $result);
// Производим поиск
$t = explode('(',$result[0]);
//print_r ($t);
echo $t[1];
?>


а если подумать минут 5, как я только что сделал, то так:)))


<?php
$responce = "<a href='http://samp-rus.com/forum/0-0-1-3-792' target='_blank'>форум(<b>150</b>)</a>";
// Производим поиск
$patern = "|<a(.*)target(.*)>форум\((.*)\)<\/a>|Ui";
preg_match($patern, $responce, $result);
echo $result[3];
?>

Корвин
21.11.2008, 20:40
А точно " /modules/core/atomax/" остался там, где был на рбк(hc.ru)? Проверь пути в смысле относительно корня сайта там и здесь - и почуствуй разницу

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

Ant1Player
21.11.2008, 20:54
немножко нето я набрал 151 сообщений а он показывает 150

Pashkela
21.11.2008, 20:55
Чего не то? Второй вариант 100 пудовый, я проверял

ЗЫЖ Конкретно для той страницы, что ты дал, конечно, не надо думать, что есть универсальная регулярка для ЛЮБОЙ страницы. Для каждой в каждом случае пишется СВОЯ, УНИКАЛЬНАЯ регулярка фактически, если не классика - собрать все урлы и прочее. Когда тебе надо выцепить что-то конкретное и ОДНО со страницы - всегда УНИКАЛЬНАЯ регулярка для КАЖДОГО сайта

Ant1Player
21.11.2008, 21:05
лан фот все сделал че хател
<?php
$responce = file_get_contents("http://samp-rus.com/index/8-792");
// Производим поиск
$patern = "|<a(.*)target(.*)>форум\((.*)\)<\/a>|Ui";
preg_match($patern, $responce, $result);
echo $result[3];
?> + потсавлю

Pashkela
21.11.2008, 21:06
))) Спасибо

Ru}{eeZ
22.11.2008, 14:43
У кого-нибудь есть регулярки поисков (название, текст, ссылка найденныго) яндекса, гугла, маилру, рамблер, апорт...? А то самому долго составлять

Ant1Player
22.11.2008, 14:43
вот у меня возник есче 1 вопрос
есть страница но нанее заходит только при вводе логина и пароля
естесно таким макаром текст не проверишь нужно подгружать куки
<?php
$responce = file_get_contents("http://vkontakte.ru/id21029966?71514");
// Производим поиск
$patern = "|<a(.*)target(.*)>Сообщения\((.*)\)<\/a>|Ui";
preg_match($patern, $responce, $result);
echo $result[3];
?>

вопрос такой, как подгрузить куки для проверки текста

!{ra!{e/\/
22.11.2008, 15:26
Вопрос насчет Mod_Rewrite ...Обязательны ли флаги в конце.И какую роль играют флаги.Как влияют на поисковых ботов?
Мой пример
RewriteRule ^.*-ispolniteli([0-9]*)\.html$ /groop/index.php?id=$1
Все ли нормально какой флаг ставить чтоб поисковые боты не ругались)?

Pashkela
22.11.2008, 15:40
Флаги RewriteRule
R[=code] Перенаправление на новый URL по заданному коду

F Forbidden (отправляет заголовок 403)
G Больше не существует (Gone)

P Прокси (Proxy)
L Последнее правило

N Следующий
C Chain

T=mime-type Установка mime-type
NS Skip if internal sub-request

NC Не зависимый от регистра символов
QSA Append query string (Прибавляет строку запроса)

NE Не отменяет результат
PT Через

S=x Пропустить следующие x правил
E=var:value Устанавливает переменную окружения "var" в "value".


http://www.regioninfo.ru/mod_rewrite.php

Я всегда в конце добавляю [L,QSA] и всё ок пока было

NOmeR1
25.11.2008, 22:35
вот у меня возник есче 1 вопрос
есть страница но нанее заходит только при вводе логина и пароля
естесно таким макаром текст не проверишь нужно подгружать куки
<?php
$responce = file_get_contents("http://vkontakte.ru/id21029966?71514");
// Производим поиск
$patern = "|<a(.*)target(.*)>Сообщения\((.*)\)<\/a>|Ui";
preg_match($patern, $responce, $result);
echo $result[3];
?>

вопрос такой, как подгрузить куки для проверки текста
Юзай сокеты, курл (медленнее всего), или, если у тебя PHP >= 5, добавь куки в контекст. Пример:
$opts = array(
'http' => array(
'header' => "Cookie: кукисы=кукисы;кукисы=кукис ;\r\n"
)
);
$ctx = stream_context_create($opts);
$responce = file_get_contents("http://vkontakte.ru/id21029966?71514", false, $ctx);

Doom123
04.12.2008, 19:29
Пишу бб коды .. .уже мозг не работает ...
нужна регулярка чтоб определяля если задан первый параметр ... тоесть ..
blabal делаю

'#\(.*?)\[/link\]#i' если в строке только этот бб код ... тоесть
[link=]bla то регулярка понимает что параметр пуст ....

НО если строка вида ... ][/B]bla то регулярка понимает ][bb]
как первый параметр ... надеюсь вы меня поняли =)

VDShark
04.12.2008, 19:41
Пишу бб коды .. .уже мозг не работает ...
нужна регулярка чтоб определяля если задан первый параметр ... тоесть ..
blabal делаю

'#\(.*?)\[/link\]#i' если в строке только этот бб код ... тоесть
[link=]bla то регулярка понимает что параметр пуст ....

НО если строка вида ... ][/B]bla то регулярка понимает ][bb]
как первый параметр ... надеюсь вы меня поняли =)
Например не .+ а [^]]+

Doom123
04.12.2008, 19:44
уху уже нашёл спасиб )

Pashkela
04.12.2008, 19:44
[delete]

уже ответили

OnArs
04.12.2008, 20:40
Всем привет!

Хочу парсить таблицу одного сайта.

Таблица начинается вот с этого:
<table id="bbtable" cellpadding="0" cellspacing="0">

Заканчивается вот этим:
</td></tr></table><div id="bbnotes"><span class="title">

Делаю вот так:
<?
$responce = file_get_contents("http://www.site.com/ges.aspx");
$patern = '|<table id="bbtable" cellpadding="0" cellspacing="0">(.*)</td></tr></table><div id="bbnotes"><span class="title">|Ui';
preg_match($patern, $responce, $result);
echo $result[1];
?>

Но увы ничего не выходит и судя по всему есть ошибки :)
Подскажите пожалуйста как будет правильно и в чём ошибка. Большое Спасибо! ;)

Pashkela
04.12.2008, 21:07
<?
$responce = file_get_contents('http://www.site.com/ges.aspx');
preg_match('/table(.*)id(.*)cellpadding(.*)cellspacing(.*)>(.*?)<\/td><\/tr><\/table><div(.*)id(.*)><span(.*)class(.*)>/s', $responce, $result);
echo $result[5];
?>

Ru}{eeZ
04.12.2008, 21:22
<?php
$response = file_get_contents("http://www.site.com/ges.aspx");
preg_match_all('|<table id="bbtable" cellpadding="0" cellspacing="0">(.*)</td></tr></table><div id="bbnotes"><span class="title">|', $response, $result);
echo '<pre>'; var_dump($result); echo '</pre>';
?>

Gifts
04.12.2008, 21:26
Pashkela Это особая уличная магия, использовать двадцать жадных подмасок, которые никогда не потребуются?

OnArs Вместо .* используй [\s\S]* или добавь модификатор s

OnArs
04.12.2008, 21:26
Странно но не работает - я даже ссылку спалю :)
http://www.moneyfacts.co.uk/money/mortgages/4/buy-to-let-mortgages.aspx
Вкладка Buy-to-let

т.е.:

<?
$responce = file_get_contents('http://www.moneyfacts.co.uk/money/mortgages/4/buy-to-let-mortgages.aspx');
preg_match('/table(.*)id(.*)cellpadding(.*)cellspacing(.*)>(.*?)<\/td><\/tr><\/table><div(.*)id(.*)><span(.*)class(.*)>/s', $responce, $result);
echo $result[5];
?>

Pashkela
04.12.2008, 21:28
<?php
$response = file_get_contents("http://www.site.com/ges.aspx");
preg_match_all('|<table id="bbtable" cellpadding="0" cellspacing="0">(.*)</td></tr></table><div id="bbnotes"><span class="title">|', $response, $result);
echo '<pre>'; var_dump($result); echo '</pre>';
?>


Не будет такое работать. Наверное лучше не постить, не испробовав:)

Ru}{eeZ
04.12.2008, 21:29
Странно но не работает - я даже ссылку спалю :)
http://www.moneyfacts.co.uk/money/mortgages/4/buy-to-let-mortgages.aspx
Вкладка Buy-to-let

т.е.:

<?
$responce = file_get_contents('http://www.moneyfacts.co.uk/money/mortgages/4/buy-to-let-mortgages.aspx');
preg_match('/table(.*)id(.*)cellpadding(.*)cellspacing(.*)>(.*?)<\/td><\/tr><\/table><div(.*)id(.*)><span(.*)class(.*)>/s', $responce, $result);
echo $result[5];
?>

preg_match_all()
http://ru2.php.net/preg_match_all

и не пиши ты везде эти скобки, а только там, где тебе что-то нужно будет выводить, пиши []

Gifts
04.12.2008, 21:32
OnArs
$responce = file_get_contents('http://www.moneyfacts.co.uk/money/mortgages/4/buy-to-let-mortgages.aspx');
preg_match('#<table id="bbtable" cellpadding="0" cellspacing="0">([\s\S]*)</td></tr></table><div id="bbnotes"><span class="title">#Ui', $responce, $result);
echo $result[1];

OnArs
04.12.2008, 22:29
OnArs
$responce = file_get_contents('http://www.moneyfacts.co.uk/money/mortgages/4/buy-to-let-mortgages.aspx');
preg_match('#<table id="bbtable" cellpadding="0" cellspacing="0">([\s\S]*)</td></tr></table><div id="bbnotes"><span class="title">#Ui', $responce, $result);
echo $result[1];

Работает! Большое Спасибо!
И всем кто отписался тоже бооольшое спасибо! :)

OnArs
04.12.2008, 22:52
Хм... За исключением одного - почёму то переходя по ссылке [I]_http://wwws.co.uk/money/mortFixed5, а не Buy To Let

Как бы это исправить? =(

// уже решил....

b3
05.12.2008, 04:52
Есть страница, на ней по 50 ников юзверей, в исходнике они :
<a href="viewpro.php?uid=2088543" class="bold">levskarq_</a>
между етими тегами, есесно uid у всех разный, нужна регулярка которая всех запихнет в массив. Я делал :
preg_match('#class="bold">(.*?)</a>#UiS', $result, $matches);
ненаходит =\ находит, но не то что надо. С меня огромный плюсик, сижу уже больше часа.

Solker
05.12.2008, 05:02
preg_match_all(
'#<a href="viewpro\.php\?uid=([0-9]+)" class="bold">(.+?)</a>#',
$result,
$matches);

OnArs
06.12.2008, 02:42
И снова здравствуйте!

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


<a href="javascript:openWindow('/
best-buys/fees/p/maqtp5tiYJWTZJiVkWlqZpJrnmixpqvaypXJxqWUdpakqpus2q Zgr6l_ttbQpJeq2mXHrNSveLLIosbGpLWmoJWrnKukopXJ1nOm u7ldl6XRctqy1Jx2yNegiMKf1W-dmqSkndOinqHKpdLIz5w/')" title="BM Solutions - Buy to Let">


Как бы так заменить всё тело ссылки, я имею ввиду то, что находится внутри ковычек, там где сейчас яваскрипт, на то что мне нужно?

Думаю, что в любом случае придётся пользоваться функцией str_replace, но вот как правильно составить регулярку?

Пробую вот так:
preg_match_all( '<a href="(.+?)" title="BM Solutions - Buy to Let">', $result , $matches );
Но увы... Подскажите, что-нибудь, пожалуйста!

Doom123
06.12.2008, 02:57
preg_replace('#<a href=".+?" title="BM Solutions - Buy to Let">#im',$zamena,$result);

Попробуй так ..

Pashkela
06.12.2008, 03:00
preg_match_all('/<a href="(.*)" title(.*)>/s', $list, $result);
echo $result[1][0];

Doom123
06.12.2008, 03:04
Pashkela * - означает что может не быть симолов вообще ...
так что лучше использовать + ...
и от жадности лечить тоже нада думаю .. вопросиком =)

Pashkela
06.12.2008, 03:07
Это понятно, писано для данного конкретного случая, люблю поимпровизировать:)

OnArs
06.12.2008, 03:22
preg_match_all('/<a href="(.*)" title(.*)>/s', $list, $result);
echo $result[1][0];

Имено твой вариант работает...
А ты можешь переделать это под preg_replace?
Если не тяжело конечно...

Но мне нужно имено тело href'а, а титл кстати меняется для каждой ссылки...

Pashkela
06.12.2008, 03:32
если тебе надо только ОДИН раз спарсить ПЕРВУЮ попавшуюся ссылку с ТАКИМИ условиями, то конечно лучше preg_replace.

А то, что "титл кстати меняется для каждой ссылки..." - именно у меня и предусмотренно


<?
preg_match('/<a href="(.*)" title(.*)>/s', $list, $result);
echo $result[1];
?>


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

Тьфу блин, башка вообще уже не варит в пол-третьего:) В общем preg_replace как ты хочешь применить? Сохранить в файл и там заменить по тем условиям, что тебе надо? Сформулируй задачу почетче. Сколько таких ссылок на странице - 1 или несколько и т.д.

AkyHa_MaTaTa
06.12.2008, 03:41
Но мне нужно имено тело href'а, а титл кстати меняется для каждой ссылки...

Если тока для href, то почти как указал Pashkela:
<?
preg_match('/<a href="(.*)" .*>/s',$a, $result);
echo $result[1];
?>

OnArs
06.12.2008, 03:51
2Pashkela:

Примерно такого содержания код страницы:
<a href="javascript:openWindow('/
berQ0p6inQ/')" title="t">text here</a>
<span>Enquire</span></a>
</div><div class="buttonDetails">
<a class="button details" href="javascript:openWindow('/
berQ0p6inQ/')" title="t">and here text too</a>


В первом случае встречается ссылка без указания class'а в другом с указанием class'a.

Всего на странице около 7 ссылок и хотелось бы реализовать через preg_replace.

Нужно заменить чудо:
href="javascriptopenWindow('/berQ0p6inQ/')"
на
href="index.html"

Вот и всё...

AkyHa_MaTaTa
06.12.2008, 04:31
Ну как то так


$sourc=<<<HERE
<a href="javascript:openWindow('/
berQ0p6inQ/')" title="t">text here</a>
<span>Enquire</span></a>
</div><div class="buttonDetails">
<a class="button details" href="javascript:openWindow('/
berQ0p6inQ/')" title="t">and here text too</a>
<a href="javascript:openWindow('/
berQ0p6inQ/')" title="t">text here</a>
<span>Enquire</span></a>
</div><div class="buttonDetails">
<a class="button details" href="javascript:openWindow('/
berQ0p6inQ/')" title="t">and here text too</a>
<a href="javascript:openWindow('/
berQ0p6inQ/')" title="t">text here</a>
<span>Enquire</span></a>
HERE;


echo preg_replace("|(javascript:openWindow\('\/.*\/'\))|sU", "index.html",$sourc);

Pashkela
06.12.2008, 05:45
<?
/* Создай файл tema.txt и запихни туда следующее, чтобы проверить работу проги:

<a href="javascript:openWindow('/berQ0p6inQ/')" title="t">text0</a>
<a class="button details" href="javascript:WINDOW('/berQ0341/')" title="t">text1</a>
<a class="button details" href="javascript:WINDOW('/berQ0342/')" title="t">text2</a>
<a class="button details" href="javascript:WINDOW('/berQ0343/')" title="t">text3</a>

*/


/* Чтобы проверить результаты работы надо
запустить в опере, выйдет два столбика -
оригинал и измененный, просто поднести мышку
и посмотреть, как изменились ссылки, также
создается файл tema1.txt, где измененные исходники */

$fp = fopen("tema.txt", "r");
$list = fread($fp, filesize("tema.txt"));
fclose($fp);
echo $list . "\r\n"; /* удалить потом, просто показывает как было в оригинале */
/*--------------------------------------------------------------------------------------------------------------*/
// Собственно сама замена
/*------------------*/
if (preg_match_all('/href="(.*)" title(.*)/i', $list, $result))
{
$count = count($result[1])-1;
for ($i=0;$i<=$count;$i++) $list = str_replace($result[1][$i], "index.html", $list);
}
/*------------------*/
// Конец замены
$fp = fopen("tema1.txt", "a+");
fwrite($fp,$list . "\r\n");
fclose($fp);
echo $list . "\r\n";
/*-------------------------------------------------------------------------------------------------------------*/
?>


будет работать независимо от содеражания
того, что в кавычках "javascript:openWindow('/
berQ0p6inQ/')" и вообще легко подстраивается под
любые нужды

OnArs
06.12.2008, 10:49
Еее!!! Большое Спасибо!!!
Всё наконец то получилось, Сейчас раздам Плюсы! :)

_Kris_
07.12.2008, 14:54
Надо скопировать текст который находится между <b><kis="ar"> и </b>
Вот вообщем надо регулярку, текст не в одну строку а в несколько.

Chaak
07.12.2008, 15:36
Надо скопировать текст который находится между <b><kis="ar"> и </b>
Вот вообщем надо регулярку, текст не в одну строку а в несколько.
$w = '<b><kis="ar"> и </b>';
preg_match('#<b><kis\="ar">(.{0,})</b>#im',$w,$n);
$a= $n['1'];
$b = $n['1'];

AkyHa_MaTaTa
07.12.2008, 15:46
$w = <<<THIS
<b><kis="ar">мля большой при большой текст
даеше и с прееводом строки
несколько
раз
</b>

THIS;

preg_match('#<b><kis\="ar">(.*?)</b>#is',$w,$n);


print_r($n);

_Kris_
07.12.2008, 15:56
preg_match('#<b><kis\="ar">(.*?)</b>#is',$w,$n);
</b>#is
is - что это значит?

_Kris_
07.12.2008, 16:00
Кстати не пашет.

Pashkela
07.12.2008, 16:22
if (preg_match_all('/<b><kis(.*)>(.*)<\/b>/i', $list, $result)) print_r ($result);



текст не в одну строку а в несколько


в html весь текст идет сплошняком в одну строку, и те ВВОДЫ, что ты сделал вручную для перевода строки, не подействуют, пока не поставишь например <br> - а это уже совсем другая регулярка. Так что то, что выглядит текстом " в несколько строк" но не имеет внутри текста разделителей строк - просто текст в одну строчку

Пробелы учитываются.

AkyHa_MaTaTa
07.12.2008, 16:31
is - что это значит?
кстати пашет, модификатор шаблона s (PCRE_DOTALL) - будет означать что метасимвол "." означаюший любой символ будет также засчитываться и для переводов строки.

_==wolf==_
10.12.2008, 19:42
народ, читал читал, ну никак не доходят до меня регулярки, какой реврайт надо сделать чтобы было так. юзер заходит на pipiska.chlen.ru и ему показывают страницу chlen.ru/pipiska ? тоесть *.chlen.ru = chlen.ru/*

GreenBear
10.12.2008, 19:46
http://www.umaxforum.com/archive/index.php/t-3572.html

_==wolf==_
10.12.2008, 19:53
cпасибо, сейчас попробую поставить, может заработает

mff
15.12.2008, 19:14
Подскажите, нужно написать регулярку, для дополнительного поля профиля пользователя на форуме vBulletin

Нужно исключить в этом поле "http" и прочие адреса сайтов.
Спасибо!

m0nsieur
15.12.2008, 19:39
попробуй так

preg_match('/\\b(http:\/\/|)([-A-Z0-9.]+)(\/[-A-Z0-9+&@#\/%=~_|!:,.;]*)?(\\?[-A-Z0-9+&@#\/%=~_|!:,.;]*)?/i', $subject)

mff
15.12.2008, 20:38
http://i74.servimg.com/u/f74/12/44/55/09/56565610.gif

Мне вставить в это поле :
/\\b(http:\/\/|)([-A-Z0-9.]+)(\/[-A-Z0-9+&@#\/%=~_|!:,.;]*)?(\\?[-A-Z0-9+&@#\/%=~_|!:,.;]*)?/i

это допустимо будет?

Задача исключить в этом поле, при регестрации пользователя - имена сайтов.

ntldr
15.12.2008, 22:48
http://i74.servimg.com/u/f74/12/44/55/09/56565610.gif

Мне вставить в это поле :
/\\b(http:\/\/|)([-A-Z0-9.]+)(\/[-A-Z0-9+&@#\/%=~_|!:,.;]*)?(\\?[-A-Z0-9+&@#\/%=~_|!:,.;]*)?/i

это допустимо будет?

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

GreenBear
15.12.2008, 22:51
Тогда он будет допускать только такие имена пользователей, которые похожи на адреса сайтов.
? тут дело логики, а не регулярки.

Ru}{eeZ
15.12.2008, 22:57
надо что-то типа:
|.+[^http^https^ftp]*.+|

mff
15.12.2008, 22:58
Вот так написал ^[а-я][А-Я]* и теперь в поле Имя Фамилия нельзя записать адрес сайта...

Pashkela
15.12.2008, 23:03
if (preg_match('/\\b(http:\/\/|)([-A-Z0-9.]+)(\/[-A-Z0-9+&@#\/%=~_|!:,.;]*)?(\\?[-A-Z0-9+&@#\/%=~_|!:,.;]*)?/i', $subject, $res)) условие, если да;
else условие, если нет;

ntldr
15.12.2008, 23:15
? тут дело логики, а не регулярки.
я понимаю, просто я говорю, что будет если ту строчку вставить в то поле(как мне кажется)

Ru}{eeZ
16.12.2008, 22:11
Переменная (массив) в регулярке.
preg_match('/^[^ ^($badNames)].{1,12}$/', $_POST['nameUser']);

регулярки вообще бегают по массивам?
как правильно сделать, чтобы регуляркой проверялись на исключение все значения массива.
Массив типа:

$badNames = array(
'Admin',
'Administrator'
);

ntldr
16.12.2008, 22:46
Переменная (массив) в регулярке.
preg_match('/^[^ ^($badNames)].{1,12}$/', $_POST['nameUser']);

регулярки вообще бегают по массивам?
как правильно сделать, чтобы регуляркой проверялись на исключение все значения массива.
Массив типа:

$badNames = array(
'Admin',
'Administrator'
);

бегают, если им дать пинка

foreach ($badNames as $item)
{
preg_match('/^[^ ^($item)].{1,12}$/', $_POST['nameUser']);
}

Gifts
16.12.2008, 23:03
Ru}{eeZ А что вы собственно собрались этими регулярками делать оО. Если проверять, что вводимый логин не начинается со слов в массиве, то лучше использовать strpos

$badNames = array(
' ',
'Admin',
'Administrator'
); //Включая пробел

foreach($badNames as $nam) if (stripos($_POST['nameUser'],$nam)===0) die('Неправильное имя');// ===0 чтобы остановиться, только если запрещенное слово в начале строки.

Gifts
17.12.2008, 15:30
Помогите с рекурсивной регуляркой. Есть входной текст: <div class="a1">
<div class="b1">
<div class="c1">
sometext1
</div>
<div class="c2">
sometext2
</div>
</div>
</div>
<div class="a1">
<div class="b1">
<div class="c1">
sometext3
</div>
<div class="c2">
sometext4
</div>
</div>
</div> Нужно получить все, что находится между <div class="a1"> и соответствующим ему </div>. Причем, для любого количества вложенных дивов

Pashkela
17.12.2008, 16:22
Ну если тебе нужно выдернуть только sometext№№, то тогда можно так:


<?
preg_match_all('|<div(.*)class(.*)>(.*)</div>|Ui', $s, $result);
print_r ($result);
?>


Данные будут в $result[0][0] $result[0][1] $result[0][2] $result[0][3]

Gifts
17.12.2008, 16:34
Pashkela Во-первых, точка НЕ учитывает перевод строки без модификатора "s". Во вторых при вложенных, одинаковых тэгах результатом будем получать кривые данные, типа: <div class="b1">
<div class="c1">
sometext3

И в третьих - зачем использовать подмаски, там где это мягко говоря не нужно?

Pashkela
17.12.2008, 16:39
Во первых всё работает. Это раз. Во вторых (правда не знал, что ты не знаешь таких эелементарных вещей) - если ты проверяешь на исходном тексте в .txt файле, то всё должно быть написано в одну строчку. Никаких <br> я там не увидел.

ЗЫЖ Если все сохранить в .txt в одну строку и запустить мою регулярку - всё прекрасно работает

Gifts
17.12.2008, 16:46
<?php
$in=
'<div class="a1">
<div class="b1">
<div class="c1">
sometext1
</div>
<div class="c2">
sometext2
</div>
</div>
</div>
<div class="a1">
<div class="b1">
<div class="c1">
sometext3
</div>
<div class="c2">
sometext4
</div>
</div>
</div>';

if (preg_match_all('|<div(.*)class(.*)>(.*)</div>|Ui', $in, $result))
print_r ($result); else echo 'Нету такого';

результат без модификатора s:
Нету такого
Результат C модификтором s:
Array
(
[0] => Array
(
[0] => <div class="a1">
<div class="b1">
<div class="c1">
sometext1
</div>
[1] => <div class="c2">
sometext2
</div>
[2] => <div class="a1">

<div class="b1">
<div class="c1">
sometext3
</div>
[3] => <div class="c2">
sometext4
</div>
)

[1] => Array
(
[0] =>
[1] =>
[2] =>
[3] =>
)

[2] => Array
(
[0] => ="a1"
[1] => ="c2"
[2] => ="a1"
[3] => ="c2"
)

[3] => Array
(
[0] =>
<div class="b1">
<div class="c1">

sometext1

[1] =>
sometext2

[2] =>
<div class="b1">
<div class="c1">
sometext3

[3] =>
sometext4

)

)
Вопросы?

Pashkela
17.12.2008, 16:54
Нет, ну молодец конечно, просто это не надо в случае парсинга реальной html-страницы

Gifts
17.12.2008, 16:58
Реальная html страница:

<?PHP $in="<html>\r\n<body>Надеюсь это не откровение, что в ХТМЛ можно вставлять переводы строк? Хоть они и не будут показаны в браузере, однако в исходном коде будут пристутствовать \r\n</body>\r\n</html>";
echo $in;


Вопрос актуален - подскажите рекурсивную регулярку для любого количества вложеных дивов

Pashkela
17.12.2008, 17:08
В качестве доказательсва моей правоты - парсер зе беста с Баша, без всяких там "s"

<?
$filename = file_get_contents('http://bash.org.ru/best');
$patern = '|<div>(.*)</div>|Ui';
preg_match_all($patern, $filename, $result);
print_r ($result);
?>


В исходниках сплошные красные абзацы:))) Учим html и не тупим:) Peace

Gifts
17.12.2008, 17:16
Pashkela $patern = '|<body(.*)</body>|Ui'; Проверь, как же так, бедааа, тэг <body есть, закрывающий </body> есть, а ничего не выводит.. Бедаааа. А то что в дивах самих цитат нет переводов строк, как бы логично. Данные берутся из БД и следить за опрятностью кода - не нужно

Ну давай расскажи мне что я не прав)

Pashkela
17.12.2008, 17:27
лучше выложу тебе код на твой конкретный случай, раз тебе так надо:)


<?
$in=
'<div class="a1">
<div class="b1">
<div class="c1">
sometext1
</div>
<div class="c2">
sometext2
</div>
</div>
</div>
<div class="a1">
<div class="b1">
<div class="c1">
sometext3
</div>
<div class="c2">
sometext4
</div>
</div>
</div>';


if (preg_match_all('/<div class="a1">(.*)<\/div>/s', $in, $result))
echo 'Оле!'. "\r\n"; else echo 'Нету такого';
$t = explode("\r\n", $result[0][0]);
$count = count($t);
for ($i=0;$i<$count;$i++)
{
if (!empty($t[$i])) {echo $t[$i];}
}
?>

Pashkela
17.12.2008, 17:41
$patern = '|<body(.*)</body>|Ui';

потому что закрыть забыл первый тег ">"

правильно так:

$patern = '|<body>(.*)</body>|Ui';

Gifts
17.12.2008, 18:01
Pashkela Не пиши по моему вопросу ничего плиз. Вы опасны для моего мозга

лучше выложу тебе код на твой конкретный случай, раз тебе так надо

PHP код:
<?
$in=
'<div class="a1">
<div class="b1">
<div class="c1">
sometext1
</div>
<div class="c2">
sometext2
</div>
</div>
</div>
<div class="a1">
<div class="b1">
<div class="c1">
sometext3
</div>
<div class="c2">
sometext4
</div>
</div>
</div>';


if (preg_match_all('/<div class="a1">(.*)<\/div>/s', $in, $result))
echo 'Оле!'. "\r\n"; else echo 'Нету такого';
$t = explode("\r\n", $result[0][0]);
$count = count($t);
for ($i=0;$i<$count;$i++)
{
if (!empty($t[$i])) {echo $t[$i];}
}
?>
Эт имба код - прогнать через жадную регулярку, и вывести код построчно, я бы так не сумел

$patern = '|<body(.*)</body>|Ui';

потому что закрыть забыл первый тег ">"

правильно так:

$patern = '|<body>(.*)</body>|Ui';
Афигеть, зайди на этот баш, открой исходный код страницы и посмотри что начальный тэг тела документа выглядит: <body style="margin: 0px;"> Поэтому тэг СПЕЦИАЛЬНО не закрыт

Pashkela
17.12.2008, 18:04
"Эт имба код - прогнать через жадную регулярку, и вывести код построчно, я бы так не сумел"

Зато рабочий

"Вы опасны для моего мозга"

Конечно, неприятно осознавать, когда тебе знаниями по мозгам надавали:) Выкладывай хоть какую-то свою рабочую не " имба" версию, ламота:)))

ЗЫЖ Развелось псевдо-спецов. Лично тебе помогать больше не буду, если ты так просишь. Ему рабочий код дали - а оно тут пузыри пускает сидит. Ппц. Извините, простите, что выложил вас вероятно не самое оптимальное решение вашей проблемы. Больше не повторится

"Афигеть, зайди на этот баш"

Молодой человек, если вы ничего не понимаете в регулярках, то лучше не выё, в тот момент мне конкретно на баш уже было пох. А ваш вариант -

$patern = '|<body(.*)</body>|Ui';

полный бред:)

Gifts
17.12.2008, 18:44
Постараюсь все-таки объяснить, что Вы биплан (самолет такой убогий)

Начнем - в быдлокоде, что Вы предложили последним. С помощью жадной регулярки получаете массив. Элемент $result[0][0] содержащий ВСЮ переменную $in. (Если у вас вдруг установлен PHP можете это проверить) Дальше вы разбиваете этот массив и выводите все не пустые строки. Но ояебу, можно было бы написать echo $in; результат был бы тот же.

Заметьте, я объяснил в чем вы не правы, и насколько вы не правы. При этом я не свел все это рассуждение, как вы - "моя твоя труба качал".

Прежде чем что-то, кому-то советовать, проверяйте все таки это у себя.

Pashkela
17.12.2008, 19:11
"Прежде чем что-то, кому-то советовать, проверяйте все таки это у себя."

ыыыы, во-во, вот и проверь-те:


<?
$in=
'<div class="a1">
<div class="b1">
<div class="c1">
sometext1
</div>
<div class="c2">
sometext2
</div>
</div>
</div>
<div class="a1">
<div class="b1">
<div class="c1">
sometext3
</div>
<div class="c2">
sometext4
</div>
</div>
</div>';


if (preg_match_all('/<div class="a1">(.*)<\/div>/s', $in, $result))
echo 'Оле!'. "\r\n"; else echo 'Нету такого';
print_r ($result);
?>


ЗЫЖ Чем дальше в лес, тем глубже человек загоняет себя в задницу:)

Пуся, я всегда и абсолютно всё проверяю, прежде чем сюда выкладывать:)

astrologer
17.12.2008, 19:21
2Gifts
'~<div class="\w\d">((?:[^<>]+|(?R))*)</div>~si'

Pashkela
17.12.2008, 19:26
2Gifts
'~<div class="\w\d">((?:[^<>]+|(?R))*)</div>~si'

))) И? Вы чо тут, сговорились что ли?:))) В итоге все равно раздельных значений нет:))))))) Все равно explode применять:))) И если сделать:


$t = explode("\r\n", $result[0][0]);
print_r ($t);

То там те же пустые строки присутствуют, да еще только первых двух значений:)

А моя регулярка в разы проще, и, что самое главное, корректней

astrologer
17.12.2008, 19:59
))) И? Вы чо тут, сговорились что ли?:))) В итоге все равно раздельных значений нет:))))))) Все равно explode применять:))) И если сделать:


$t = explode("\r\n", $result[0][0]);
print_r ($t);

То там те же пустые строки присутствуют, да еще только первых двух значений:)

А моя регулярка в разы проще, и, что самое главное, корректней Показываешь своё незнание?

Pashkela
17.12.2008, 20:01
Показываешь своё незнание?

а по делу? Гы-гы просто

ЗЫЖ Продолжаем разговор. Сами запустите свой скрипт хоть разок и посмотрите, чо там, где да как

ЗЗЫЫЖЖ Я в шоке сегодня с некоторых доселе уважаемых мною личностей

PS: И еще, чтобы безосновательно не тыкать в меня пальцем и не кричать "ОН ЛАМО!" (я не знаю, может у тебя любовь там с Gifts или еще что) может выложим готовый код по решению задачи Gifts-а именно в том ручье, в котором он думает, оно ему надо? Не просто регулярку какую-то взятую с неба и абсолютно бестолковую на мой взгляд, а код, от А до Я, как у меня? Тогда и сравним, чей код быстрей, правильней и оптимальней:) Пока я тут наблюдаю только один рабочий код - а именно свой. Со всем риспектом и etc.

astrologer
17.12.2008, 20:15
Хорошо, чтобы не быть голословными, разберём результаты работы двух вариантов. Итак, для начала выясним, сколько было всего найдено совпадений.
У твоего варианта - одно, что уже фейл. Вот это совпадение, начинается на начале первого блока и захватывает заодно и второй (было бы их там 200, всё равно совпадение было бы одно): [0] => Array
(
[0] => <div class="a1">
<div class="b1">
<div class="c1">
sometext1
</div>
<div class="c2">
sometext2
</div>
</div>
</div>
<div class="a1">
<div class="b1">
<div class="c1">
sometext3
</div>
<div class="c2">
sometext4
</div>
</div>
</div>
)Теперь совпадения подмасок. Тоже одно: [1] => Array
(
[0] =>
<div class="b1">
<div class="c1">
sometext1
</div>
<div class="c2">
sometext2
</div>
</div>
</div>
<div class="a1">
<div class="b1">
<div class="c1">
sometext3
</div>
<div class="c2">
sometext4
</div>
</div>

) Собственно, аналогичное для второго варианта:
Совпадения регулярки:[0] => Array
(
[0] => <div class="a1">
<div class="b1">
<div class="c1">
sometext1
</div>
<div class="c2">
sometext2
</div>
</div>
</div>
[1] => <div class="a1">
<div class="b1">
<div class="c1">
sometext3
</div>
<div class="c2">
sometext4
</div>
</div>
</div>
)Совпадания подмасок: [1] => Array
(
[0] =>
<div class="b1">
<div class="c1">
sometext1
</div>
<div class="c2">
sometext2
</div>
</div>

[1] =>
<div class="b1">
<div class="c1">
sometext3
</div>
<div class="c2">
sometext4
</div>
</div>

Pashkela
17.12.2008, 20:17
Я извиняюсь, а вы последнюю версию моего скрипта запускаете или где? По всей видимости вы юзаете мою ПЕРВУЮ регулярку, заточенную под сайты, а не под бредовые требования Giffts-а. Господа, будьте внимательней, в последнем варианте моего скрипта совсем другая регулярка.

ЗЫЖ Продам очки, недорого

Вот моя последняя и вполне рабочая версия, можете найти её несколько выше, еще до Вашего первого поста по этой задаче:


<?
$in=
'<div class="a1">
<div class="b1">
<div class="c1">
sometext1
</div>
<div class="c2">
sometext2
</div>
</div>
</div>
<div class="a1">
<div class="b1">
<div class="c1">
sometext3
</div>
<div class="c2">
sometext4
</div>
</div>
</div>';


if (preg_match_all('/<div class="a1">(.*)<\/div>/s', $in, $result))
echo 'Оле!'. "\r\n"; else echo 'Нету такого';
$t = explode("\r\n", $result[0][0]);
$count = count($t);
for ($i=0;$i<$count;$i++)
{
if (!empty($t[$i])) {echo $t[$i];}
}
?>

astrologer
17.12.2008, 20:19
Я извиняюсь, а вы последнюю версию моего скрипта запускаете или где? По всей видимости вы юзаете мою ПЕРВУЮ регулярку, заточенную под сайты, а не под бредовые требования Giffts-а. Господа, будьте внимательней, в последнем варианте моего скрипта совсем другая регулярка.

ЗЫЖ Продам очки, недорого Из сообщения 102.

astrologer
17.12.2008, 20:28
Вот моя последняя и вполне рабочая версия Выводит вот это: Оле!
<div class="a1">
<div class="b1">
<div class="c1">
sometext1
</div>
<div class="c2">
sometext2
</div>
</div>
</div>
<div class="a1">
<div class="b1">
<div class="c1">
sometext3
</div>
<div class="c2">
sometext4
</div>
</div>
</div>
может выложим готовый кодРазумеется<?php

$in =
'<div class="a1">
<div class="b1">
<div class="c1">
sometext1
</div>
<div class="c2">
sometext2
</div>
</div>
</div>
<div class="a1">
<div class="b1">
<div class="c1">
sometext3
</div>
<div class="c2">
sometext4
</div>
</div>
</div>';


preg_match_all('~<div class="\w\d">((?:[^<>]+|(?R))*)</div>~si', $in, $data);
print_r($data[1]);

?>

Pashkela
17.12.2008, 20:29
2 astrologer:

Надеюсь теперь увидели, о каком коде идёт речь? "Пост 102" - лихо конечно, но пока не в тему. Жду от вас с нетерпением Вашего кода. Желательно предварительно проверенного и рабочего:) Но готов и просто принять "Паша, ты был прав, о чем тут писать дальше - просто не вижу смысла". А то флудильня получается. А яйцами с вами меряться мне недосуг, ибо голые факты пока за меня, если без эмоций:)

astrologer
17.12.2008, 20:33
2 astrologer:

Надеюсь теперь увидели, о каком коде идёт речь? "Пост 102" - лихо конечно, но пока не в тему. Жду от вас с нетерпением Вашего кода. Желательно предварительно проверенного и рабочего:) Но готов и просто принять "Паша, ты был прав, о чем тут писать дальше - просто не вижу смысла". А то флудильня получается. А яйцами с вами меряться мне недосуг, ибо голые факты пока за меня, если без эмоций:) Жаль расстраивать, но факты против тебя. Ты был неправ, о чём тут писать дальше - просто не вижу смысла.

Pashkela
17.12.2008, 20:34
Выводит вот это: Оле!
<div class="a1">
<div class="b1">
<div class="c1">
sometext1
</div>
<div class="c2">
sometext2
</div>
</div>
</div>
<div class="a1">
<div class="b1">
<div class="c1">
sometext3
</div>
<div class="c2">
sometext4
</div>
</div>
</div>



ыыыыы, интересненько, а у меня выводит вот это:


Оле!


sometext1

sometext2





sometext3

sometext4


а поводу вашего я написал сразу же после вашего кода, Ваш код нерабочий, ппц, имхо

ЗЫЖ Ребята, к Chaak в ЛС хоть пройдите, а то мне уже неудобно тут с вами. Незлобный я в принципе:)

astrologer
17.12.2008, 20:39
ыыыыы, интересненько, а у меня выводит вот это:

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

Pashkela
17.12.2008, 20:42
"Надо исходник смотреть, как все делают."

ыыыыыы, отсыпьте, чо вы там с Giffts-ом покурили, усыхаю с вас:)))))))))))))))

.:EnoT:.
17.12.2008, 20:47
Сегодня день срача?) То в одной теме, то в другой...ппц

ыыыыы, интересненько, а у меня выводит вот это:
это у тебя на экран выводит, а в исходном коде всё равно дивы)
Но тут можно избавиться от них ф-цией strip_tags()

А отпарсить парный див в данном случае думаю невозможно, т.к. либо парсить всё, либо до первого дива с модификатором U.

Поэтому в данном случае регулярка Pashkela имеет смысл, но немного недоработана.
Вот немного переделал:
preg_match_all('#<div[^>]*>([^>]*)</div>#sU', $in, $result);
print_r($result);

результатом будет:

[1] => Array
(
[0] =>
sometext1

[1] =>
sometext2

[2] =>
sometext3

[3] =>
sometext4

)

)

Чистый текст, что у нужен был Gifts`у :)

Pashkela
17.12.2008, 21:52
2 astrologer мои извинения:) Исходники страницы не посмотрел:)

Gifts
17.12.2008, 22:02
Я таки домучал эту штуку<pre><?php
$in='<div class="a1">
<div class="b1">
<div class="c1">
sometext1
</div>
<div class="c2">
sometext2
</div>
</div>
</div>
<div class="a1">
<div class="b1">
<div class="c1">
sometext3
</div>
<div class="c2">
<div class="d1">
<a href="somelink">asdasasd</a>
</div>
</div>
</div>
</div> ';

$start=microtime(true);
if (preg_match_all('~<div[^>]*>((?(?=(?>(<div|</div>)))(?R)|[\s\S])*)</div>~si', $in, $result, PREG_SET_ORDER))

foreach ($result as $one) echo htmlspecialchars($one[1])."\r\n-----------------------------\r\n";

echo microtime(true)-$start; Находит весь текст между дивами верхнего уровня, для любой глубины вложенности

.:EnoT:. Боюсь, что банальная ссылка внутри дива заставит регулярку пропустить эту ссылку

astrologer Спасибо за направление для копания)

Pashkela
17.12.2008, 22:07
.:EnoT:. Боюсь, что банальная ссылка внутри дива заставит регулярку пропустить эту ссылку


а если так, то моя моя регулярка остается самой логичной, гыыыыыыыыы. Но с поправкой .:EnoT:.-а

Gifts
17.12.2008, 22:12
Pashkela Как обезьянка, ей-богу
$in=
'<div class="a1">
<div class="b1">
<div class="c1">
sometext1
</div>
<div class="c2">
sometext2
</div>
</div>
</div>
<div class="a1">
<div class="b1">
<div class="c1">
sometext3
</div>
<div class="c2">
sometext4
</div>
</div>
</div>';
echo "<h1>До регулярки:</h1><br>\r\n";
var_dump(htmlspecialchars($in));
echo "<h1>После регулярки:</h1><br>\r\n";
if (preg_match_all('/<div class="a1">(.*)<\/div>/s', $in, $result)) var_dump(htmlspecialchars($result[0][0]));
echo "<br><h1>А теперь внимание, найдите десять отличий</h1>";

Zircool
18.12.2008, 15:54
<h2>
<a href="/News/Detail/id/325474/cat/66/" >
Почему опустели офисы?</a> </h2>


Для такого html кода какая будет регулярка что бы ссылку... Тлоько что бы в регулярке были теги <h2> и </h2>...т.к. на странице с которой грабишь много ссылок вида <a href="">.... нужны ссылки которые именно в тегах <h2> и </h2> находяься...

Shadow_p1raT
18.12.2008, 16:07
я не профан в регулярках но думаю что мона и так:

<?php
$text = '
<h2>
<a href="/News/Detail/id/325474/cat/66/" >
Почему опустели офисы?</a> </h2>';

preg_match('~<h2>.*<a href="(.*)" >~sUiS',$text,$reg);
echo $reg['1'];
?>

Isis
18.12.2008, 16:09
Zircool,
<?php
$a = '<h2>
<a href="/News/Detail/id/325474/cat/66/" >
Почему опустели офисы?</a> </h2> ';
preg_match('#<h2>.*<a.?href="(.*?)".*>.*</a>.*</h2>#', $a, $b);
print_r($b);
?>

Pashkela
18.12.2008, 16:15
<?
$in=
'<h2>
<a href="/News/Detail/id/325474/cat/66/" >
Почему опустели офисы?</a>
</h2> ';

if (preg_match_all('/<h2>(.*)<\/h2>/s', $in, $result))
echo $result[1][0]; else echo 'Нету такого';
?>

Ru}{eeZ
20.12.2008, 13:59
$name = '{TITLE}';
$value = 'Заголовок';
$file = preg_replace('|\{$name\}|i',$value,$file,-1);
Что в регулярке неправильно составил?

п.с. строковые не советовать, и так строковую использую:
$file = str_replace('{'.$name.'}',$value,$file);
просто хочу и с этой регуляркой разобраться

[dei]
20.12.2008, 14:08
$name = '{TITLE}';
$value = 'Заголовок';
$file = preg_replace("|$name|i", $value, $file);

Pashkela
20.12.2008, 14:18
<?
$name = '{TITLE}';
$value = 'Заголовок';
echo preg_replace($name, $value, $name);
?>

Gifts
20.12.2008, 15:22
Ru}{eeZ Всяко лучше строковая функция, но если уж так хочется, то чтобы регулярка интерпретировала переменную как текст, нужно использовать preg_quote $name = '{TITLE}';
$value = 'Заголовок';
$file = preg_replace('|'.preg_quote($name).'|i',$value,$fi le);

Ru}{eeZ
20.12.2008, 19:05
а если так:
$file = 'кимек иек итек кет кт д.дж.{TITLE} v,lvfrl r rv {HEADER} vvvv';
$name = 'TITLE';
$value = 'Заголовок';
$file = preg_replace('|\{$name\}|i',$value,$file,-1);

мне же надо именно между фигурными скобками

Pashkela
20.12.2008, 19:38
<?
$file = 'sdlfgsdlgldsgh ssdflksdjf {TITLE} v,lvfrl r rv {HEADER} vvv';
$name = 'TITLE';
$value = 'Заголовок';
$file = preg_replace('{'.$name.'}', $value, $file);
echo $file;
?>

[dei]
20.12.2008, 19:54
а если так:
$file = 'кимек иек итек кет кт д.дж.{TITLE} v,lvfrl r rv {HEADER} vvvv';
$name = 'TITLE';
$value = 'Заголовок';
$file = preg_replace('|\{$name\}|i',$value,$file,-1);

мне же надо именно между фигурными скобками
Переменные не подставляются в одинарных кавычках!

нужно:
$file = preg_replace("|\{$name\}|i",$value,$file);

незачем писать -1 в четвертый параметр функции preg_replace

mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit ] )
Выполняет поиск в строке subject совпадений с шаблоном pattern и заменяет их на replacement . В случае, если параметр limit указан, будет произведена замена limit вхождений шаблона; в случае, если limit опущен либо равняется -1, будут заменены все вхождения шаблона.

Ru}{eeZ
20.12.2008, 19:56
ппц, тупанул когда писал. не думал, что переменную повешу. Вообще забыл и ещё парился чё я типа не так делаю =\
Спасибо

#Wolf#
24.12.2008, 15:39
прошу помощи. нужен парсер новостей http://primamedia.ru/export/main.htm (или в тхт http://primamedia.ru/export/main.txt)
чтобы я мог повставлять в таблицы отдельно - дату, новость etc
синтаксис прегматча оказался для меня очень сложен (
заранее благодарю

d_x
24.12.2008, 15:53
<?php
//новости получаем из main.htm в переменную $news

//парсим
preg_match_all("/pm_newsdate'>(.+)\.<\/span>\t<a href='(.+)'>(.+)<\/a>\t<div class='pm_newsdesc'>(.+)<\/div>/isU", $news, $m);

/*
Результат:
$m[1] - дата и время новостей
$m[2] - ссылка на полный текст новости
$m[3] - заголовок новости
$m[4] - краткое описание новости
*/
print_r($m);
?>

m0Hze
28.12.2008, 00:58
Соствна:
Есть файл,ну по обычаю пусчай будет индыкс.пхп
В нем есть текст,начало формы:
<form action"любой текст"....>
Нужно,"любой текст",заменить на my.php, тоесть на фыходе имею стрраницу,но уже
<forn action "my.php"...>
1) актионс может находиться в любом месте в теге форм,соответственно поиск должен проходить только по action"(.+)"
Но так как я в регулярках ничерта не смыслю (синтаксес тяжолый,прям *Опа),то помагайте ребят =)

Pashkela
28.12.2008, 01:03
Ну а может уточним задание и будет тогда <form action="любой текст">

или я не прав???

[dei]
28.12.2008, 01:13
Соствна:
Есть файл,ну по обычаю пусчай будет индыкс.пхп
В нем есть текст,начало формы:
<form action"любой текст"....>
Нужно,"любой текст",заменить на my.php, тоесть на фыходе имею стрраницу,но уже
<forn action "my.php"...>
1) актионс может находиться в любом месте в теге форм,соответственно поиск должен проходить только по action"(.+)"
Но так как я в регулярках ничерта не смыслю (синтаксес тяжолый,прям *Опа),то помагайте ребят =)


$text = preg_replace('/action="[^"]*"/','action="my.php"',$text);

m0Hze
28.12.2008, 01:13
Прав,сори за очепятку...

m0Hze
28.12.2008, 01:17
$text = preg_replace('/action="[^"]*"/','action="my.php"',$text);
Вот только один вопрос остался..
А вот я например всегда пишу

action = "fgfg"...

Как быть с пробелами?Универсальный способ я так понимаю не придумать :)

Pashkela
28.12.2008, 01:36
<?
$text = '<form action = "kfk">';
$text = preg_replace('/action.*=.*"[^"]*"/','action="my.php"',$text);
//дальше просто смотри исходники получившейся страницы, чтобы проверить результат
?>

.:EnoT:.
28.12.2008, 01:42
Лучше так:
$text = preg_replace('/action[\s\S]=[\s\S]"[^"]*"/','action="my.php"',$text);


UPD:
Хотя нет, лучше вот так:
$text = preg_replace('#action[\s]?=[\s]?"[^"]*"#', 'action="my.php"', $text);

astrologer
28.12.2008, 11:48
<pre>
<?

$text = <<<markup

<form action=http://example.com></form>
<form action="http://example.com"></form>
<form action='http://example.com'></form>

<form action = "http://example.com"></form>
<form action ="http://example.com"></form>
<form action= "http://example.com"></form>

markup;

$pattern = <<<regexp
~action\s*=\s*(?:"[^"]*"|'[^']*'|[^\s>]*)~
regexp;

$text = preg_replace($pattern, 'action="my.php"', $text);

echo htmlspecialchars($text);

?>
</pre>

ICD2
30.12.2008, 16:52
Помогите разобраться пожалуйста, имеется вот такой конфиг -
root@newsystems:~# cat /var/www/.htaccess
Options +FollowSymLinks
RewriteEngine On
RewriteCond %{REQUEST_URI} !php

RewriteRule ^about$ index.php?action=about [L]
RewriteRule ^tools$ index.php?action=tools [L]
RewriteRule ^register$ index.php?action=register [L]
RewriteRule ^myuploads$ index.php?action=myuploads [L]
RewriteRule ^thread$ thread.php [L]
RewriteRule ^feedback$ feedback.php [L]

RewriteRule ^thread/([0-9]+)/?$ thread.php?id=$1 [NC]
RewriteRule ^thread/([0-9]+)/([0-9]+)/?$ thread.php?id=$1&num=$2 [NC]

последние 2 строки не рабочие =/ как сделать правильно?

groundhog
30.12.2008, 16:56
ICD2, есть SSH доступ к серверу?

Pashkela
30.12.2008, 23:00
Попробуй так:

RewriteRule ^thread\/([0-9]+)\/$ thread.php?id=$1 [L,QSA]
RewriteRule ^thread\/([0-9]+)\/([0-9]+)\/$ thread.php?id=$1&num=$2 [L,QSA]

ICD2
31.12.2008, 01:07
хрень какая то... так тоже не работает =/

Pashkela
31.12.2008, 01:58
а как ты проверяешь? На бери сначала в браузере вместо http://твой_сайт/thread.php?id=1

http://твой_сайт/thread/1/

ICD2
31.12.2008, 02:16
а как ты проверяешь? На бери сначала в браузере вместо http://твой_сайт/thread.php?id=1

http://твой_сайт/thread/1/

хм.. извините, но голова на плечах у меня еще есть :)

Pashkela
31.12.2008, 02:48
RewriteRule ^thread\/([0-9]+)\/$ thread.php?id=$1 [L,QSA]

Вот так у меня работает, если лежит в .htaccess в корне того, откуда идет вызов, так что нех.

Проверил на своеём форум http://site.ru/forum/thread.php?id=101

где такой .htaccess лежит в папке

/forum

RewriteEngine On
RewriteRule ^thread\/([0-9]+)\/$ thread.php?id=$1 [L,QSA]

ЗЫЖ СНГ

ICD2
01.01.2009, 02:09
Вы не поверите, но не работает. можете сами проверить, в пм жаббер скиньте, я Вам RSA ключи дам

m0Hze
03.01.2009, 01:13
Интересует вот что.Есть страница.полученая по средствам курла,или филе_гет_контент,не имеет значения. Нужно отпарсить из нее все данные,которые имеют вид:
***.***.***.***:port где * цыфры,но их может быть и меньше трех,тоесть получаеться чтотовроде прокси граббера.Мучался с регулярками,но у меня только порт сволоч дергает :)

Jer1cho
03.01.2009, 01:22
preg_match('#[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\:[0-9]{1,5}#', $text, $out);

m0Hze
03.01.2009, 01:29
Теперь другой вопрос,совсем тупой.Просто чтото я совсем после НГ туплю :D
Есть текст в переменной.Его нужно тупо отпарсить на наличие напроимер "Hello!". если в тексте есть ета переменная,то ша()ююююнет то elseююну и тд.Собственно никак не вспоню как отпарсить текст на нужное нам значение.
\\все вспонил,но возможно ктото посоветует свои варианты,мне будет интересно :)

Jer1cho
03.01.2009, 01:34
http://php.net/strpos

DTW
09.01.2009, 18:28
<?php
$ip = 'this123 some12 text12 as4 192.145.85.123 and wil12 posisble';
$pat3= '/\w*\s+(\d+.\d+.\d+.\d+)/is';

// вывести ип

$p = preg_match($pat3,$ip,$pockets3);
echo $pockets3[1];
echo "<br/>". $p;



?>


как еще лучше получить значение ип ?

_evgeniy_
09.01.2009, 19:47
<?php
function get_proxy($url)
{
$content = file_get_contents($url);
preg_match_all('/([\d]+){1,3}\.([\d]+){1,3}\.([\d]+){1,3}\.([\d]+){1,3}/',$content,$proxy_list);
return $proxy_list['0'];
}

echo "<pre>";
print_r(get_proxy('http://www.samair.ru/proxy/'));
echo "</pre>";
?>

Pashkela
09.01.2009, 20:11
$ip = 'this123 some12 text12 as4 192.145.85.123 and wil12 posisble 111.222.333.444';

$pat3= '/([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/is';
// вывести ип
$p = preg_match_all($pat3,$ip,$pockets3);
print_r ($pockets3);
?>

Byrger
09.01.2009, 22:37
Помогите сделать красивые ссылки...
Почитал почитал всё... и ничего не выходит..
Получилось только
RewriteRule ^my_page\.html$ /index.php?str=pok
https://site.ru/my_page.html

А мне нужно сделать чтоб ссылка
http://site.ru/index.php?str=pok
Была изменчива часть "pok"
Это каждую страницу нужно прописывать?


И как убрать .html если пишу
RewriteRule ^my_page\$ /index.php?str=pok
то на http://site.ru/my_page/ Не заходит

Дикс
09.01.2009, 22:58
не могу никак ни вспомнить, ни найти регулярку, которая бы заменяла
[ b]текст[ /b]
на
<b>текст</b>

Дошёл до этого:
$string = "пост длинный пост ЫЫЫЫЫ длинный пост пост ЫЫЫЫЫ2длинный пост ";

$pattern = "/\[q\](.*)\[\/q\]/i";
$replacement = "<b>\${1}</b>";
echo $string.'<br />';
echo preg_replace($pattern, $replacement, $string);

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

Pashkela
09.01.2009, 23:07
<?
$string = "пост длинный пост ЫЫЫЫЫ длинный пост пост ЫЫЫЫЫ2длинный пост ";
$pattern[0] = "/\[q\]/";
$replacement[0] = "<b>";
$pattern[1] = "/\[\/q\]/";
$replacement[1] = "</b>";
echo $string.'<br />';
echo preg_replace($pattern, $replacement, $string);

_evgeniy_
09.01.2009, 23:25
Была изменчива часть "pok"
Это каждую страницу нужно прописывать?


И как убрать .html если пишу

то на http://site.ru/my_page/ Не заходит

RewriteRule ^([a-zA-Z0-9_]+)/$ index.php?str=$1

и при заходе на

http://site.ru/pok/ будет http://site.ru/index.php?str=pok и

http://site.ru/my_page/ будет http://site.ru/index.php?str=my_page

Дикс
10.01.2009, 09:24
Pashkela
эт я знаю. но если в сообщении будут незакрытые теги [q] - там появятся и незакрытые теги <b> и весь последующий текст будет жирным! надо перебрать все комбинации.

я помню блин как я делал это вроде в одну строку..
или может надо сначала выдрать все вхождения preg_matchem? а потом уже их заменять..

Byrger
10.01.2009, 09:59
RewriteRule ^([a-zA-Z0-9_]+)/$ index.php?str=$1

и при заходе на

http://site.ru/pok/ будет http://site.ru/index.php?str=pok и

http://site.ru/my_page/ будет http://site.ru/index.php?str=my_page


Сделал как ты написал, но весь сайт прогружается без картинок....
Как быть?

Pashkela
10.01.2009, 11:58
но если в сообщении будут незакрытые теги [q]


вот это да...тогда не знаю

chlp
10.01.2009, 12:32
Сделал как ты написал, но весь сайт прогружается без картинок....
Как быть?
Попробуй
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

_evgeniy_
10.01.2009, 13:07
но он обрабатывает самый первый и самый последний теги - второй и третий игнорируются.. что не так? точнее как указать правильно, чтобы он обработал все по очереди?

попрбуй так

<?
$string = "пост ЫЫЫ-<>Ы12Ы длинный пост ЫЫЫ323ЫЫ длинный ЫЫЫ34ЫЫ пост пост ЫЫЫЫЫ2длинный пост ";

$pattern = "/\[q\](.*?)\[\/q\]/i";
$replacement = "<b>\${1}</b>";
echo $string.'<br />';
echo preg_replace($pattern, $replacement, $string);

astrologer
10.01.2009, 14:11
Дикс,

$original = '/\[q\](.*)\[\/q\]/i';

$pattern1 = '-\[q\](.*?)\[/q\]-i';
// ^

$pattern2 = '-\[q\](.*)\[/q\]-Ui';
// ^

Zitt
10.01.2009, 14:30
Pashkela эт я знаю. но если в сообщении будут незакрытые теги [q] - там появятся и незакрытые теги <b> и весь последующий текст будет жирным! надо перебрать все комбинации. я помню блин как я делал это вроде в одну строку.. или может надо сначала выдрать все вхождения preg_matchem? а потом уже их заменять..


dei (12:26:46 10/01/2009)
<?php
$string = "пост ЫЫЫ-<>Ы12Ы длинный пост ЫЫЫ323ЫЫ длинный ЫЫЫ34ЫЫ пост пост ЫЫЫЫЫ2длинный пост 1adasdsadas [q] sadasdasd sad";

echo $string.'<br />'."\n";
echo preg_replace('|\[q\]([^\[]*?)\[/q\]|', '<b>$1</b>', $string);
?>

а оставшиеся теги можно выловить стр_реплейсом


Den (12:26:46 10/01/2009)
отправил ))

PandoraBox
10.01.2009, 15:07
работа с ссылками <http>

<?php

$url = "http://site/script.php";
preg_match('~^(http://)?([^/?#]+)(/[^?#]*)?(\?[^#]*)?(#.*)?$~i', $url, $matches);

echo "Full path: ".$matches[0]."<br />"; // http://site/script.php
echo "Protocol: ".$matches[1]."<br />"; // http://
echo "Domain: ".$matches[2]."<br />"; // site
echo "Script: ".$matches[3]."<br />"; // /script.php

?>

.:EnoT:.
10.01.2009, 15:16
и зачем? Когда есть ф-ция parse_url(), которая делает тоже самое...

Gifts
10.01.2009, 16:10
Zitt Ваша регулярка поперхнется, если в тексте будут вложенные тэги или даже просто [

$string = "пост ЫЫЫ-[q]<>[/qwwe][Ы12Ы длинный пост ЫЫЫ323ЫЫ длинный ЫЫЫ34ЫЫ пост пост ЫЫЫЫЫ2длинный пост 1adasdsadas [q] sadasdasd sad";

echo $string.'<br />'."\n";
echo preg_replace(
array('~\((?!\[/?q\])|[\s\S]*?)\[/q\]~i',
'~\[/?q\]~i'),
array('<b>$1</b>'
,''), $string);

Плюс - тут удаляются все лишние [q] и

m0Hze
11.01.2009, 04:21
Почиму не работает такой выражение?

RewriteEngine On
RewriteRule ^([a-zA-Z0-9_]+)/$ index.php?page=$1

Я хочу,чтобы при обращении mysite.ru/admin открывалось index.php?page=admin

m0Hze
11.01.2009, 04:43
Спасибо,помог

ntldr
11.01.2009, 05:02
Почиму не работает такой выражение?

RewriteEngine On
RewriteRule ^([a-zA-Z0-9_]+)/$ index.php?page=$1

Я хочу,чтобы при обращении mysite.ru/admin открывалось index.php?page=admin
RewriteRule ^([a-zA-Z0-9_]+)/?$ index.php?page=$1

AkyHa_MaTaTa
11.01.2009, 05:07
RewriteRule ^([a-zA-Z0-9_]+)/? index.php?page=$1
наверно вот так
RewriteEngine On
RewriteRule ^([a-zA-Z0-9_]+)$ inc.php?page=$1

ntldr
11.01.2009, 05:09
наверно вот так
RewriteEngine On
RewriteRule ^([a-zA-Z0-9_]+)$ inc.php?page=$1
я обновил, скорее так надо

AkyHa_MaTaTa
11.01.2009, 05:11
я обновил, скорее так надо
RewriteRule ^([a-zA-Z0-9_]+)/?$ index.php?page=$1
ты опять не прав, попробуй сначало.
Для
"Я хочу,чтобы при обращении mysite.ru/admin открывалось index.php?page=admin"

RewriteEngine On
RewriteRule ^([a-zA-Z0-9_]+)$ inc.php?page=$1

ntldr
11.01.2009, 05:18
RewriteRule ^([a-zA-Z0-9_]+)/?$ index.php?page=$1
ты опять не прав, попробуй сначало.
Для
"Я хочу,чтобы при обращении mysite.ru/admin открывалось index.php?page=admin"

RewriteEngine On
RewriteRule ^([a-zA-Z0-9_]+)$ inc.php?page=$1
аа мне почему-то покаалось что ему со слешем вконце надо, будет работать
mysite.ru/admin
и mysite.ru/admin/

AkyHa_MaTaTa
11.01.2009, 05:24
аа мне почему-то покаалось что ему со слешем вконце надо, будет работать
mysite.ru/admin
и mysite.ru/admin/
Если бы со слешом в конце его метод бы работал

и у тебя ? не заэкранирован(и зачем он вообше там)

Nicca
12.01.2009, 16:25
Посдкажите регулярное выражение чтобы:
Есть текст и в нем фото(<img src="">). Как с него вырезать фото? В одну переменную поместить фото, в другую текст без фото

m0nsieur
12.01.2009, 18:57
preg_match('/<img src="(.*)">/i', $subject);

Вот таким образом можно достать картинку из src, а какой тебе текст нужен еще, что-то не понял..уточни.

Malunga
12.01.2009, 21:53
Всем привет)) Вопрос вот какой: Как заставить регулярку парсить только определённое количество вхождений??
Допустим в исходной строке 20 ссылок, регуляркой мы их парсим. так вот как заставить регулярку парсить предположим только первые 5 ссылок и всё?? ясный пень что можно взять нужные ссылки из результата что вернула регулярка, но вопрос в скорости работы, дабы в моём случае далеко не 20 ссылок, а намного больше......

D Mak
12.01.2009, 21:55
имхо никак

Pashkela
12.01.2009, 22:24
PREG_SET_ORDER
PREG_OFFSET_CAPTURE

http://ru2.php.net/manual/ru/function.preg-match-all.php

w.u.n.
12.01.2009, 22:25
Всем привет)) Вопрос вот какой: Как заставить регулярку парсить только определённое количество вхождений??
Допустим в исходной строке 20 ссылок, регуляркой мы их парсим. так вот как заставить регулярку парсить предположим только первые 5 ссылок и всё?? ясный пень что можно взять нужные ссылки из результата что вернула регулярка, но вопрос в скорости работы, дабы в моём случае далеко не 20 ссылок, а намного больше......
ну тип так

<?php
$text = file_get_contents('http://www.google.com');

$n=10;//количество вхождений
$i=1;

header('Content-type: text/plain');
$p=0;
while(preg_match('/<a.*?>(.*?)<\/a>/',$text,$m,PREG_OFFSET_CAPTURE,$p)) {
echo $m[0][0]."\n";
$p=$m[0][1]+1;

if($n==$i++) break;
}
?>

Malunga
12.01.2009, 22:34
w.u.n., огромное спасибо!!!! то что нужно)))

Pashkela, если ты не понял то не надо ничего писать...

Pashkela
12.01.2009, 22:36
w.u.n., огромное спасибо!!!! то что нужно)))

Pashkela, если ты не понял то не надо ничего писать...

ты дурак? Посмотри на код, что тебе дали

ЗЫЖ Расплодили даунов

Смотри на мою мессагу и смотри на предложенный код, попробуй найти совпадения

Malunga
12.01.2009, 22:46
ты дурак? Посмотри на код, что тебе дали

ЗЫЖ Расплодили даунов

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

Pashkela
12.01.2009, 22:49
ты реально туп, приятель, еще бы мне тратить время на даунов всяческих

Для обезьян:


PREG_SET_ORDER
PREG_OFFSET_CAPTURE
http://ru2.php.net/manual/ru/function.preg-match-all.php



while(preg_match('/<a.*?>(.*?)<\/a>/',$text,$m,PREG_OFFSET_CAPTURE,$p)) {


отдыхайте, молодой человек, нежно посасывая в уголке.

ЗЫЖ Думай, потом пиши, дурачок:)

Malunga
12.01.2009, 22:56
Ты в своём уме вообще?
Одним флагом тут ничего не решается, так что ты снчала подумай, а потом печатай.
А то складывается дурное впечатление о твоём профессионализме, дружок!

.:EnoT:.
12.01.2009, 22:59
Базар свой прекращаем, бабки! Сидят тут пальцы гнут друг перед другом.
Вы оба не отличаетесь особым профессионализмом.
Так что переносим споры в пм, аську, куда угодно, а тему оставляем для регулярок)

Pashkela
12.01.2009, 22:59
delete

jabber
16.01.2009, 18:18
Постигая мудрость фреймворков, обнаружил невиданную ранее особенность:

URL вида
http://localhost/222/front .php
работал также при добавлении в конец слеша и любого мусора
http://localhost/222/front .php/dfojdofjso

В моём представлении такой URL мог соответствовать исключительно одной ситуации — наличии каталога с именем front.php и файла без расширения с именем dfojdofjso.

Озадаченный подобным казусом я полез на форум с вопросом «как такое может быть?». Мне сказали что дело в некой неизвестной мне тогда директиве MultiViews. Я обрадовался и закрыл тему, но поспешил. Оказалось, что эта директива всего лишь разрешает писать URL вида (1) вместо (2):

1) http://localhost/222/front
2) http://localhost/222/front .php

А ссылка вида
http://localhost/222/front .php/dfojdofjso
cпокойно работает при отключённом MultiViews!!! Вот что печатает этот скрипт:

REQUEST_URI => /222/front.php/dfdf
SCRIPT_NAME => /222/front.php
PHP_SELF => /222/front.php/dfdf
SCRIPT_FILENAME => z:/home/localhost/www/222/front.php

Я успокоил себя тем, что апач находит файл front.php и, рассудив, что это и есть его цель, выдаёт страницу. Т.е. поместил проблему в чёрный ящик.
Далее я создал .htaccess с таким содержимым:

RewriteEngine on
RewriteRule ^(.*)$ front\.php/dfojdofjso [L]

Т.е полагается переадресовывать любой запрос на front.php с мусором после слеша. Я ожидал один из двух вариантов:
1) сработает, как и при вводе URL http://localhost/222/front.php/dfojdofjso
2) не сработает и выдаст ошибку 404

Далее я проверил URL:
http://localhost/222/dfojdofjso.php
но результат оказался иным — произошла 500-я ошибка, а по логам — зацикливание.

Тут можно было бы обложится мануалами и разбираться в чём суть, но я продолжил эксперименты и получил во много раз более парадоксальную ситуацию. Изменённый .htaccess

RewriteEngine on
RewriteCond $1 !^front\.php
RewriteRule ^(.*)$ front\.php/sdfsdf [L]

И... это заработало. Заработало как в случае совпадения с front\.php, так и в случае несовпадения!

1) http://localhost/222/front.php
REQUEST_URI => /222/front.php
SCRIPT_NAME => /222/front.php
PHP_SELF => /222/front.php
SCRIPT_FILENAME => z:/home/localhost/www/222/front.php

2) http://localhost/222/dfojdofjso .php
REQUEST_URI => /222/dfojdofjso.php
SCRIPT_NAME => /222/front.php
PHP_SELF => /222/front.php/sdfsdf
SCRIPT_FILENAME => z:/home/localhost/www/222/front.php

Т.е добавление условия заставило нерабочее правило работать как в случае выполнения условия (1), так и в случае невыполнения условия (2), чего, по идее, быть не может. Вообще, я предпочитаю разбираться во всём самостоятельно, однако данная ситуация разорвала мой мозг поэтому приходится просить помощи снова. Общее представление как работает mod rewrite я имею, поэтому прошу не отсылать меня к абстрактной документации.

На всякий случай сформулирую вопросы:

1) Как же всё-таки URL вида
http://localhost/222/front.php/dfojdofjso
при наличии файла front.php работает при отключённом MultiViews?

2) Самый главный вопрос — почему правило

RewriteEngine on
RewriteRule ^(.*)$ front\.php/sdfsdf [L]

вызывает зацикливание независимо от URL, а правило

RewriteEngine on
RewriteCond $1 !^front\.php
RewriteRule ^(.*)$ front\.php/sdfsdf [L]

не вызывает зацикливания, опять таки независимо от URL?

Прошу прощения за длинный пост :)

Pashkela
16.01.2009, 18:43
RewriteRule обратные_связи: Это обратные связи вида

$N

(0 <= N <= 9) предоставляющие доступ к сгруппированным частям (в круглых скобках!) шаблона из соответствующей директивы RewriteRule (единственной, следующей сразу за текущим набором директив RewriteCond).

.........

Условие это шаблон условия, т.е., какое-либо регулярное выражение применяемое к текущему экземпляру СравниваемаяСтрока, т.е., СравниваемаяСтрока просматривается на поиск соответствия Условие.

Помните: Условие это perl совместимое регулярное выражение с некоторыми дополнениями:

Вы можете предварять строку шаблона префиксом '!' (восклицательный знак) для указания несоответствия шаблону.


http://htaccess.net.ru/doc/mod_rewrite/RewriteCond.php

т.е. у тебя типо получается если НЕ " ^front\.php", то

"^(.*)$" из строки "RewriteRule ^(.*)$ front\.php/sdfsdf [L]"

а то, что справа от "^(.*)$" - просто игнорируется, я так понял

ЗЫЖ Потому то, что справа от "^(.*)$" - ерунда какая-то:)

jabber
16.01.2009, 19:26
а то, что справа от "^(.*)$" - просто игнорируется, я так понял
Думаю не игнорируется. Переменная PHP_SELF меняется в зависимости от выполнения, невыполнения условия.

Я, пожалуй, переформулирую вопрос:

Вот .htaccess фреймворка codeigniter

RewriteEngine on
RewriteCond $1 !^(index\.php|images|robots\.txt)
RewriteRule ^(.*)$ index\.php/$1 [L]

Т.е. всё кидаем на фронт контроллер кроме картинок, цсс-стилей и т.д. а также кроме самого фронт контроллера.
Я не могу понять почему при удалении из RewriteCond составляющей "index\.php" происходит зацикливание на уровне Апача.

Для чего это всё нужно. Обычно CMS/CMF перенаправляют составляющие URL в GET-параметры, но некоторые устроены иначе — к контроллерам доступаешься так:
http://somehost.ru/index.php/somecontroller/action/param1/param2

а чтобы не писать index.php, а писать так:
http://somehost.ru/somecontroller/action/param1/param2

в .htaccess и добавляют такое правило.

Как оно распарсивается внутри, я пока не могу найти, там код мивина-стайл.

Gifts
16.01.2009, 19:57
jabber Как бы все интуитивно понятно должно быть:

RewriteCond проверяет, чтобы первая подмаска не начиналась на index.php images или robots.txt. Если выполнено - вступает в силу RewriteRule - меняем http://someshit.ru/sdsadsadasd на http://someshit.ru/index.php/sdsadsadasd

Так как произошел внутренний редирект, то данные условия проверяются еще раз, но уже для нового пути. Вот и получается бесконечное добавление index.php.

Чтобы все было более явно - поставьте флаг для внешнего редиректа - R и посмотрите на урл в браузере после захода на страницу с RewriteRule и без оного

RewriteEngine on
RewriteCond $1 !^(index\.php|images|robots\.txt)
RewriteRule ^(.*)$ index\.php/$1 [L,R]

Fak1r
16.01.2009, 20:10
Есть несколько сторок текста:
class="blu"><b>DATA</b></a>
class="blu">DATA</a>
class="blu"><b>DATA</b></a>
class="blu">DATA</a>

Нужно составить регулярку которая вытаскивает данные между тегами, в данном случае DATA.

Gifts
16.01.2009, 20:13
Fak1r preg_match_all('~class="blu">([^<])*</a>~i',$in,$out);
print_r($out);

Fak1r
16.01.2009, 20:55
Gifts

Чет не работает, проверял ругулярку на http://www.regexpr.ru/
Возвращается только буква A, и только из двух сторочек в которых нет тэга <b>.

Gifts
16.01.2009, 21:00
Fak1r * внутрь скобок надо ^^

preg_match_all('~class="blu">([\s\S]*?)</a>~i',$in,$out);
print_r($out);

Fak1r
16.01.2009, 21:38
Опять же preg_match_all возвращает:


Array
(
[0] => Array
(
[0] => class="blu"><b>DATA</b></a>
[1] => class="blu">DATA</a>
[2] => class="blu"><b>DATA</b></a>
[3] => class="blu">DATA</a>
)

[1] => Array
(
[0] => <b>DATA</b>
[1] => DATA
[2] => <b>DATA</b>
[3] => DATA
)

)

_evgeniy_
16.01.2009, 22:21
Есть несколько сторок текста:
class="blu"><b>DATA</b></a>
class="blu">DATA</a>
class="blu"><b>DATA</b></a>
class="blu">DATA</a>

Нужно составить регулярку которая вытаскивает данные между тегами, в данном случае DATA.

$in = '
class="blu"><b>DATA</b></a>
class="blu">DATA</a>
class="blu"><b>DATA</b></a>
class="blu">DATA</a>';

preg_match_all('/>(.*?)</i',$in,$out);

echo '<pre>';
print_r($out['1']);

jabber
17.01.2009, 20:00
Так как произошел внутренний редирект, то данные условия проверяются еще раз, но уже для нового пути.

Вот этого я не знал, поэтому вопрос и возник. Спасибо!

OnArs
25.01.2009, 19:50
Здравствуйте!

Есть строка в исходном коде страницы:
<font color="#339966" size="+1">0.38 &nbsp; +

Нужно парсить число, в данном случае 0.38.

Делаю вот так:
$html = '<font color="#339966" size="+1">0.38 &nbsp; +';

preg_match_all("/>(.*?) &nbsp;/i", $html, $out);

echo '<pre>';
echo $out[0];

Ничего не получаю в ответ, подскажите как сделать правильно и где ошибка?

Большое Спасибо! :)

[dei]
25.01.2009, 19:54
сделай

print_r( $out );


и поймешь что найденная подстрока лежит в $out[1][0] :)

OnArs
25.01.2009, 19:57
']сделай

print_r( $out );


и поймешь что найденная подстрока лежит в $out[1][0] :)
Чорт, точно. Значит регулярка правильная, большое спасибо! ;)

Architek86
25.01.2009, 20:29
Дан htaccess вот такого содержания:

RewriteEngine on
RewriteBase /
RewriteRule ^node/([0-9]+)([/]?)$ main.php?uri=$1

т.е. все ссылки вида http://my.site.ru/node/ЧИСЛО/ обрабатываются через main.php.


Как его дополнить так, что бы все остальные страницы, отличные от node/([0-9]+)([/]?), перенаправляли браузер на главную страницу http://my.site.ru/ ? Пробовал вот так:

RewriteEngine on
RewriteBase /
RewriteRule ^node/([0-9]+)([/]?)$ main.php?uri=$1 [L]
RewriteRule ^(.*)$ http://my.site.ru/ [L]

но Firefox ругаеццо на то, что сервер бесконечно редиректит и не может ничего выдать, т.е. данный пример не катит... Как быть? :rolleyes:

Gifts
26.01.2009, 16:09
Architek86

RewriteEngine on
RewriteBase /
RewriteRule ^node/([0-9]+)([/]?)$ main.php?uri=$1 [L]
RewriteCond $1 !^main
RewriteCond $1 !^node/([0-9]+)([/]?)$
RewriteRule ^(.*)$ http://my.site.ru/ [R,L]

ntldr
28.01.2009, 01:36
мне надо собрать всё что внутри тегов <dt></dt>

<?php
$f = file_get_contents("http://yaca.yandex.ru/");
preg_match_all("/<dt>(.*)<\/dt>/",$f,$m);
print_r($m);
?>

почему пусто??

ikolla$$
28.01.2009, 01:39
мне надо собрать всё что внутри тегов <dt></dt>

<?php
$f = file_get_contents("http://yaca.yandex.ru/");
preg_match_all("/<dt>(.*)<\/dt>/",$f,$m);
print_r($m);
?>

почему пусто??

<?php
$f = file_get_contents('http://yaca.yandex.ru/');
$search = preg_match_all('#<dt>(.*)</dt>#',$f,$m);
print_r($m);
echo $m[0];
?>

ntldr
28.01.2009, 01:45
<?php
$f = file_get_contents('http://yaca.yandex.ru/');
$search = preg_match_all('#<dt>(.*)</dt>#',$f,$m);
print_r($m);
echo $m[0];
?>

не помогло, то же самое абсолютно

ikolla$$
28.01.2009, 01:50
не помогло, то же самое абсолютно
:-D Я опять накурился,меня щас к php пускать низя :(

Gifts
28.01.2009, 01:53
ntldr Либо вместо (.*) использовать ([\s\S]*) либо

<?php
$f = file_get_contents("http://yaca.yandex.ru/");
preg_match_all("/<dt>(.*)<\/dt>/s",$f,$m);
print_r($m);
?>

Обратить внимание на модификатор s после слеша. Почему так - читать тут: http://ru.php.net/manual/ru/reference.pcre.pattern.modifiers.php

AkyHa_MaTaTa
28.01.2009, 02:37
<?php
$f = file_get_contents("http://yaca.yandex.ru/");
preg_match_all("/<dt>(.*)<\/dt>/isU",$f,$m);
print_r($m);
?>

svesve
28.01.2009, 23:55
как разложить такую строчку ??
UPDATE holidays (id,user_id,date_start,date_finish,type_id,audit_i d) VALUES ('','$_POST[user_id]','$_POST[date_start]',
'$_POST[date_finish]','$_POST[holidays_type]',
'$_SESSION[user_id]')

каждому полю соответствовало свое значение
н-р
id=''
user_id=$_POST[user_id].....

Pashkela
29.01.2009, 00:03
Так вообще делать нельзя, прикинь, чо я могу в $_POST[user_id] занести тебе прямо в базу сразу

svesve
29.01.2009, 00:06
Так вообще делать нельзя, прикинь, чо я могу в $_POST[user_id] занести тебе прямо в базу сразу
эммм а как правильно?

m0nsieur
29.01.2009, 00:24
2 svesve
он имел в виду, что необходима фильтрация пришедших данных от пользователя, в случае с $_POST[user_id] полагая, что это будет только int можно сделать так - $user_id =intval($_POST[user_id]);


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

svesve
29.01.2009, 00:32
ненен мне регулярка нужна для другого ))) вот собственно и спросил как будет выглядеть шаблон поиска!
а про фильтрацию спасибо!!!

m0nsieur
29.01.2009, 00:51
попробуй так - preg_match('/.* \\((.*)\\) .* \\((.*)\\)/i', $subject)
таким образом найдутся 2 строки - id,user_id,date_start,date_finish,type_id,audit_i и '','$_POST[user_id]','$_POST[date_start]', '$_POST[date_finish]','$_POST[holidays_type]','$_SESSION[user_id]'

для каждой строки сделаешь explode() по запятой и сохранишь результаты в разные массивы. В итоге у тебя будут 2 массива со значениями $arr1[0] = 'id' и т.д. и второй массив $arr2[0] = '' и т.д. ну а потом уже склеиваешь их как тебе надо.

bombeg
29.01.2009, 01:32
$user_id =intval($_POST[user_id]);

да и потом большинство делает запрос с user_id = 0. зачем правда не понятно.

m0nsieur
29.01.2009, 11:11
да и потом большинство делает запрос с user_id = 0. зачем правда не понятно.

ну тут надо понимать конечно, что user_id не может никогда быть 0 по логике, и делать соотв. проверку.

159932
09.02.2009, 06:09
'#\'(.+)\'#'

Nightmarе
09.02.2009, 06:18
Как в .htaccess сделать так, если в GET запросе есть слово lol, то .htaccess отсылает куда подальше.
?

Pashkela
09.02.2009, 19:16
RedirectMatch (.*lol)$ http://www.microsoft.com$1

Велемир
09.02.2009, 19:26
RedirectMatch /[^0-5]grab.php http://www.google.ee

Почему при запросе grab.php открывается сам скрипт ? Он ведь не должен удовлетворять условию запроса ? Или я чего-то не так понял.

Ещё вопросы: Как замутить редирект именно для конкретных айпи адресов,а остальных оставить в покое ?)

Нашёл статью,где писали про круглые скобки:

http://beget.ru/art9.html#mod_rewrite

* Круглые скобки () используются для выделения групп символов.В дальнейшем к ним можно обращатся по номеру.

И регулярка ниже:

RedirectMatch /(.*)/(.*)/index.html$ http://mysite.ru/script.php?par1=$1&par2=$2

Я так и не понял,как эти скобки работают,но думаю,что среагирует на любые символы в скобках,присутствующие ноль или более раз.Также непонятно,нужно ли ставить в каждой регулярке символ $ и почему здесь не стоят ограничители,которыми могут служить любые символы.В обрабатываемой строке,я так понял, будет помещён айди,обработанный по данной регулярке ?...Зачем там конец строки =_______=


RedirectMatch [^0-5] http://www.google.ee

Этой регулярке вообще насрать,что передавать.

RedirectMatch /[^0-5]/ http://www.google.ee

Так тоже.

Pashkela
09.02.2009, 20:03
SetEnvIf REMOTE_ADDR 192.168.8.1 REDIR= redir
RewriteCond %{REDIR} redir
RewriteRule ^/$ /nahui.html
*** Посетители с айпи адресом 192.168.8.1 будут перенаправляться .htaccess ом на страницу nahui.html

это про ip

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

Велемир
11.02.2009, 20:24
Ладно...не понял,так не понял.Я не знаю,как это до тебя донести ).Расшифруй тогда это :

RewriteRule ^(.*articles\/.*\/.*\/)[^?]+$ http://site.com/$1 [R=permanent,L]

Так ли нужны здесь круглые скобки и символ + ? Что получится в результате такой подстановки ?

Вот нашёл ещё...

RewriteRule ^rotator([0-9])\.xml$ /sand.php?page=st_dor&id=$1 [NE,R,L]

Почему при запросе: www.site.com/sand.php?page=st_dor&id=0
www.site.com/sand.php?page=st_dor&id=1
www.site.com/sand.php?page=st_dor&id=n где n <=9 работают ?

Я так понял,он должен получить следующий URL:

www.site.com/sand.php?page=st_dor&id=rotator0.xml
www.site.com/sand.php?page=st_dor&id=rotator1.xml

И т.д. до 9 включительно... Не понимаю,где я просчитался.

ЗЫ: Кстати,тут я нашёл SQL инъекцию,так как защита,как я понял,была основана именно на этом,в следствии чего он не блокировал символы,вызывающие инъекцию,хотя,возможно,это создавалось не в целях самозащиты(Всмысле,они не думали защищаться от взломов таким образом).

Zedi
11.02.2009, 20:37
Скобки нужны это точно, а плюсик обозначает что символ будет не один, вообще полезно будет прочитать про мод реврайт

Велемир
11.02.2009, 21:19
Да читал я,но мало что понял.Мб,ещё почитать надо

[^?]+ Думаю,что имеется ввиду любое количество символов,кроме нулевого,а также исключая символ "?"

Велемир
11.02.2009, 21:20
Скобки нужны это точно, а плюсик обозначает что символ будет не один, вообще полезно будет прочитать про мод реврайт

А то я не знаю,что они нужны.А нахрена=))

Zedi
11.02.2009, 21:24
Как можно читать и не понять? Я думаю скобки типа для объединения регулярки, чем они тебе так мешают? Читай другие мануалы, где понятно, я пользуюсь мод реврайтом постоянно и мне например как то фиолетово зачем скобки нужны, нужны значит нужны

Gifts
11.02.2009, 21:33
Велемир http://ru.wikipedia.org/wiki/ЧПУ_(Интернет)

И у вас самого написано - * Круглые скобки () используются для выделения групп символов.В дальнейшем к ним можно обращатся по номеру.

Банальный пример - есть форум, ссылки на топик вида example.com/readthread.php?id=6162 - ссылка длинная. А теперь хотим, чтобы набрав в браузере урл example.com/thread6162 мы попадали на ту же страницу что и по длинному урлу.

RedirectMatch /thread(.*) http://example.com/readthread.php?id=$1

Все урлы начинающиеся example.com/thread будут перенаправлены, при этом все что идет после этого (те самые скобки) мы "копируем" в переменную $1 которую и подставляем в редирект. Будет две скобки - две переменные и т.д.

Набрав в браузере http://example.com/thread12345678 попадем на страницу /readthread.php?id=12345678

Велемир
12.02.2009, 01:12
Как можно читать и не понять?

Ой...не спрашивай об этом Велю(

m0Hze
12.02.2009, 16:20
В общем,имеем:

<b id="performer54529005">my chemical romance</b> - <span id="title54529005">famous last words</span> </div>

Нужно получить:
my chemical romance и famous last words
Как не стараюсь,немогу получить обе строки,либо только с тегами драть.
performer54529005 - цыфры всегда разные,также ак и у титле

Pashkela
12.02.2009, 17:33
$s = '<b id="performer54529005">my chemical romance</b> - <span id="title54529005">famous last words</span> </div>';
preg_match_all('|">(.*)</b> - <span id=.*>(.*)</span>|Uis', $s, $res);
print_r ($res);

prescott
13.02.2009, 12:10
Что нужно прописать в .htaccess чтобы абсолютно все запросы на сервер вели на один скрипт в корне?

UPD: разобрался, сделал так:
RewriteRule ^.*$ aa.php

m0Hze
14.02.2009, 00:11
Как заставить прег_матч искать только первые 5 совпадения например?Пока что пришлов голову проверять коунт($res) и если = 5,то делать бряк.
Есть более гуманные способы?

Gifts
14.02.2009, 00:27
m0Hze А смысл? preg_match - возвращает первое вхождение, соответствующее маске, плюс есть параметр $offset. Написать функцию для поиска ровно 5 соответсвий не составляет труда

m0Hze
14.02.2009, 00:34
m0Hze А смысл? preg_match - возвращает первое вхождение, соответствующее маске, плюс есть параметр $offset. Написать функцию для поиска ровно 5 соответсвий не составляет труда
Несовсем тебя понял,посмотрел на php.net про оффсет,это же обозначение начала поиска вродебы?С какого символа искать.
Пускай даже я буду использовать preg_match_all, можеш посоветывать(на пальцах) как лучше осуществить поиск до заданного количества результатов??

Gifts
14.02.2009, 02:39
m0Hze Написать собственную функцию

preg_match получили первый результат
strpos+strlen($result) - получили сдвиг
повторить для нового оффсета нужное количество раз

Остается вопрос - а смысл?

Zedi
15.02.2009, 13:25
Как сделать с помощью мод_реврайта чтобы если ссылка начиналась с /ххх/ допустим, а дальше еще много символов других, то к параметрам страницы добавлялось что то типа ххх=1, ну смысл то что у мя хтассес большой очень и нужно чтобы это действовало на все записи) ссори за корявый язык)

Zedi
15.02.2009, 13:59
разобрался, ссори затупил)))

ntldr
18.02.2009, 13:07
у меня строка такого вида:
<td>-</td><td>текст1<br />текст666</td><td>-</td><td>текст1<br />текст666</td><td>-</td><td>-</td>

то есть каждый раз по разному, либо тире, либо текст, можно ли сделать чтобы запоминались только то что стоит на месте текст1?

Pashkela
18.02.2009, 13:36
<?php

$in = '<td>-</td><td>текст1<br />текст666</td><td>-</td><td>текст1<br />текст666</td><td>-</td><td>-</td>';
preg_match_all('|>текст1<|Ui',$in,$rez);
print_r ($rez);

?>

.:EnoT:.
18.02.2009, 13:39
preg_match('#<td>([^<]*)<br />#', $string, $out);
м? ну или preg_match_all если все вхождения нужны с текст1

ntldr
18.02.2009, 13:48
<?php

$in = '<td>-</td><td>текст1<br />текст666</td><td>-</td><td>текст1<br />текст666</td><td>-</td><td>-</td>';
preg_match_all('|>текст1<|Ui',$in,$rez);
print_r ($rez);

?>

текст1 - это переменная величина

.:EnoT:., ну как то так да. а есть разница если я напишу вместо решеток слеш?

Pashkela
18.02.2009, 14:00
есть, или так:

|<td>([^<]*)<br />|

или так:

/<td>([^<]*)<br \/>/

.:EnoT:.
18.02.2009, 14:03
Можно и так, чтобы не экранировать:
/<td>([^<]*)<br/

[dei]
18.02.2009, 16:56
/<td>(.*?)<br/

=\