[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: помогите с регуляркой
nvrskozzy
Смысл в том, чтобы скрипт понимал что должно стоять ДО
.*
чтобы .* включал всё до первого символа, ставим знак вопроса - ?
тоесть
.*?all
он заберёт всё до all, а как обозначить этот all перед
.*
?

дело в том, что мне нужно выдрать отсюда код ссылки all
<A HREF=/?1-3-0-00000013-000-210-0>15</A> <A HREF=/?1-3-0-00000013-000-225-0>16</A> <A HREF=/?1-3-0-00000013-000-240-0>17</A> <A HREF=/?1-3-0-00000013-000-255-0>18</A> <A HREF=/?1-3-0-00000013-000-270-0>19</A> <A HREF=/?1-3-0-00000013-000-285-0>20</A> <A HREF=/?1-3-0-00000013-000-300-0>21</A> <A HREF=/?1-3-0-00000013-000-315-0>22</A>  <a href=/?1-3-0-00000013-000-10001-0>All</A>


но если я пишу
preg_match("/(href=.*?>All<\/A>)/si", $contents, $contentszz);

то регулярка получает не только all но и 15 и 16 и всё до all, как сказать ей, "до первого знака = слева от .*" ?
уже час мучаюсь, помогите)



Спустя 17 минут, 45 секунд (15.07.2010 - 21:04) qpayct написал(а):
$text = "<A HREF=/?1-3-0-00000013-000-210-0>15</A> <A HREF=/?1-3-0-00000013-000-225-0>16</A> <A HREF=/?1-3-0-00000013-000-240-0>17</A> <A HREF=/?1-3-0-00000013-000-255-0>18</A> <A HREF=/?1-3-0-00000013-000-270-0>19</A> <A HREF=/?1-3-0-00000013-000-285-0>20</A> <A HREF=/?1-3-0-00000013-000-300-0>21</A> <A HREF=/?1-3-0-00000013-000-315-0>22</A><a href=/?1-3-0-00000013-000-10001-0>All</A>";

echo preg_match('#(\<a href=(?:.*?)\>all\<\/a\>)#is',$text);

Спустя 2 минуты, 45 секунд (15.07.2010 - 21:07) nvrskozzy написал(а):
не вышло. он опять забрал предыдущие ссылки..

Спустя 11 минут, 8 секунд (15.07.2010 - 21:18) DedMorozzz написал(а):
#(?<=>).+?all# а так?

Спустя 14 минут, 46 секунд (15.07.2010 - 21:33) nvrskozzy написал(а):
?<= почему-то тоже не помогали, он хавал всё что перед all стоит, боюсь прослыть еретиком, но после того как ?<= не помогло я так понял что это просто определяет что идёт слева от искомого, перед ним, но не говорит что нужно использовать ближайшее к искомому совпадение, тоесть собирает до последнего от искомого совпадения и вбирает в себя все ссылки)

Спустя 7 минут, 3 секунды (15.07.2010 - 21:40) qpayct написал(а):
Цитата (nvrskozzy @ 15.07.2010 - 20:07)
не вышло. он опять забрал предыдущие ссылки..

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

Спустя 38 минут, 3 секунды (15.07.2010 - 22:18) DedMorozzz написал(а):
Так, а что тебе надобно получить. То что внутри ХРЕФа? Если да, то что мешает писать так:
$a=preg_replace("#.*<A HREF=(.*)>ALL.*#uis",'$1',$a);

А если всё полностью, то вот так:
$a=preg_replace("#.*</A>(.*)ALL.*#uis",'$1',$a);

Т.е. регулярка находит последний закрывающий тег А, который перед ALL и берёт весь контент до ALL.

Спустя 2 минуты, 14 секунд (15.07.2010 - 22:20) qpayct написал(а):
а точно , блин, про "жадность" забыл, пардон

Спустя 13 часов, 46 минут, 37 секунд (16.07.2010 - 12:07) nvrskozzy написал(а):
Цитата (DedMorozzz @ 15.07.2010 - 19:18)
А если всё полностью, то вот так:
$a=preg_replace("#.*</A>(.*)ALL.*#uis",'',$a);

Т.е. регулярка находит последний закрывающий тег А, который перед ALL и берёт весь контент до ALL.

а ссылок много подряд в одной строке.. в (.*) не попадёт ли несколько ссылок?)


Спустя 2 дня, 1 час, 1 минута, 59 секунд (18.07.2010 - 13:09) nvrskozzy написал(а):
тут ещё один вопрос, подскажите пожалуйста как в регулярке показать "любые символы кроме тегов <br>" ? как прописать например любые символы кроме < понятно -
.[^<]*
я так делал, работало, жадность точки работала до первого тега, а как сделать чтоб жадная точка ела всё, но не до первого тега, а именно до первого тега <br>?
тоесть как прописать набор символов, [^<br>] не работает..

Спустя 1 час, 13 минут, 26 секунд (18.07.2010 - 14:23) nvrskozzy написал(а):
помогите 2 день скрипт не двигается с мёртвой точки sad.gif

Спустя 26 минут, 31 секунда (18.07.2010 - 14:49) DedMorozzz написал(а):
Цитата
.*</A>(.*)ALL.*#uis
Находит всё, до самого последнего закрытого тега А. Далее всё берёт до слова ALL. Сначала проверь, далее спрашивай smile.gif

Спустя 1 час, 54 минуты, 7 секунд (18.07.2010 - 16:43) nvrskozzy написал(а):
спс, просто не понял принципа работы) не подскажешь что именно тут говорит скрипту идти до самог опоследнего тега </a> ? чтоб далее сам мог подобные задачи решать)
и что значит "u" после "/" )

Спустя 19 минут, 45 секунд (18.07.2010 - 17:03) DedMorozzz написал(а):
есть 2 вида "поиска" регуляркой. "Жадный" и "ленивый". Жадный - ".*", Ленивый - .*?
Пример: $a="aaa ccc aaa ccc";
введя ".*ccc " ты получишь "aaa ccc aaa" - т.е. пытаеться найти максимальное совпадение с шаблоном, а если укажешь "ленивый" поиск, то будет найдено первое совпадение. Т.е. только "aaa"

Спустя 13 минут, 19 секунд (18.07.2010 - 17:16) qpayct написал(а):
просто и понятно:
. - любой символ
* - любое колличество символов указаных до
? - только один или вообще нет

.*? - любое колличество символов только один раз или ничего
.* - любое колличество символов любое колличество раз или ничего

можно ещё вот так написать
.*+ - любое колличество символов любое колличество раз. минимум один

все тонкости можно найти и почитать на первоисточнике:
http://www.php.net/manual/en/pcre.pattern.php

Спустя 29 минут, 26 секунд (18.07.2010 - 17:46) nvrskozzy написал(а):
аяя не так не так)) пардон) всё я не так объяснил и не так понял)

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

вот с этим я чё-то затупил.. .*</A>(.*)ALL.*#uis

да он найдёт до последнего вождения тега а )
фишка-то в чём.. чего спрашивал про ограничение жадной точки слева а не справа, тоесть до неё..

мне нужно примерно так:

.*</A> .*</A>(.*)ALL.*#uis

тоесть не просто до последнего тега дойти, а до нескольких последних, например трёх.

чтоб нашёл то что в скобках "</A>текст</A>текст(</A>текст</A>текст</A>ALL)"

тоесть при обычном написании .*</A> .*</A>(.*)ALL.*#uis в жадную точку попадёт много тегов, а мне нужно чтоб взялось несколько последних..
знак вопроса ? ограничивает точку в поиске вперёд.. а мне кагбе назад надо)

Спустя 7 минут, 44 секунды (18.07.2010 - 17:53) DedMorozzz написал(а):
Цитата
.*+ - любое колличество символов любое колличество раз. минимум один
Избыточно. + это и есть 1 и более. И по сему .*+ и .+ одно и то же.

Спустя 7 минут (18.07.2010 - 18:00) qpayct написал(а):
DedMorozzz
ну это я так, импровизанул wink.gif

спасибо за поправку

Спустя 2 часа, 1 минута, 42 секунды (18.07.2010 - 20:02) nvrskozzy написал(а):
на вопрос выше никто не знает ответа?)

Спустя 8 минут, 38 секунд (18.07.2010 - 20:11) DedMorozzz написал(а):
как же ты не любишь думать. САМ уже почти написал ответ. в суме с постами выше он у тебя уже есть
не так
Цитата
.*</A> .*</A>(.*)ALL.*#uis
а
 .*</A> .+?</A>(.*)ALL.*#uis 

Спустя 20 минут, 9 секунд (18.07.2010 - 20:31) nvrskozzy написал(а):
ну дак не работает жеш)

вот только что оттестил такой кусок

preg_match ("/(?:.*?<br>)(.*?)<br>(.*?)(<\?php require\(\"u\.php\"\))/is", "$gggg2", $dobavka);


php require бла бла это в коде страницы находится..

в итоге в 1 ячейке текст после первого бра на странице, во второй всё остальное до php require с кучей бров и прочих тегов..

Спустя 23 часа, 7 минут, 29 секунд (19.07.2010 - 19:38) -=CASPER=- написал(а):
Не буду тему создавать новую тут напишу.
У меня такая проблема не получается создать регулярку.
нужно чтобы она искала в тесте http:// и начиная от этого преобразовывала всё в ссылку до первого пробела.
Вот как я делаю:

$text = preg_replace('/http:\/\/(.*)\s/is','<a href="http://$1">$1</a> ',$text);

всё вродебы нормально. Но как только http:// начинается с новой строки под ссылку поподает весь текст и ограничение до пробела не помогает.
Почему так? Помогите исправить

Спустя 5 минут, 56 секунд (19.07.2010 - 19:44) DedMorozzz написал(а):
почитай про модификатор s. И думаю все вопросы отпадут smile.gif
nvrskozzy - увидел твой пост, потом отвечу. занят.

Спустя 57 минут, 24 секунды (19.07.2010 - 20:42) qpayct написал(а):
во первых да, тут модификатор s скорей всего не нужен, если ссылка не растягивается на несколько строк, иначе нужен, а во вторых проблема в уже рассмотреной выше "лени"
$text = preg_replace('/http:\/\/(.*)/i', '<a href="http://$1">$1</a> ', $text);

Спустя 2 часа, 4 минуты (19.07.2010 - 22:46) -=CASPER=- написал(а):
Если так писать то тогда в ссылку идёт весь текст, если ссылка с новой строки начинается.
И ограничивать до пробела если - не помогает
/http:\/\/(.*)\s/i

Спустя 3 минуты, 25 секунд (19.07.2010 - 22:49) qpayct написал(а):
-=CASPER=-
ты не привёл пример, что хранится в $text
откудаж людям знать, что надо? blink.gif

Спустя 3 минуты, 44 секунды (19.07.2010 - 22:53) -=CASPER=- написал(а):
В $text хранится текст из БД. Который заносится туда пользователем при добавлении сообщений. И как в базе будет распологаться ссылка это дело пользователя. Как он её напишет при добавлении сообщения

Спустя 17 минут, 13 секунд (19.07.2010 - 23:10) qpayct написал(а):
тоесть ты хочешь находить в этом тексте адреса и делать из них ссылки? так и пиши:
$text = "prefetching is currently only supported by Firefox. 
But since http://www.mozilla-europe.org/ru/firefox/
is the second most popular web browser in the world, you
can noticeably decrease load times for a significant chunk
of your users just by adding one line of code to your HTML.
Pretty cool, huh?"
;
$text = preg_replace('/http:\/\/(.*?) /i', '<a href="http://$1">$1</a> ', $text);
echo $text;
а то излагаешь непонятно и с ошибками

Спустя 9 минут, 26 секунд (19.07.2010 - 23:19) -=CASPER=- написал(а):
Да, я не спорю это будет работать, но только если ссылка не начинается с начала строки.

$text = "prefetching is currently only supported by Firefox. But since
http://www.mozilla-europe.org/ru/firefox/ is the second most popular web browser in the world, you can noticeably decrease load times for a significant chunk of your users just by adding one line of code to your HTML. Pretty cool, huh?"
;
$text = preg_replace('/http:\/\/(.*?)\s/i', '<a href="http://$1">$1</a> ', $text);
echo $text;

этот метод уже не работает, вот про что я говорю.

Спустя 10 минут, 42 секунды (19.07.2010 - 23:30) qpayct написал(а):
всё работает мозги не парь, а если не работает приводи конкретный пример что не работает

Спустя 4 минуты, 41 секунда (19.07.2010 - 23:35) -=CASPER=- написал(а):
Вот смотри пример, только что сообщение написал
http://waplod.net.ru/forum/messages.php?id_teme=1

Спустя 9 минут, 9 секунд (19.07.2010 - 23:44) qpayct написал(а):
-=CASPER=-
да хоть 100 таких сообщений напиши, а толку?

Спустя 1 день, 22 часа, 31 минута, 54 секунды (21.07.2010 - 22:16) nvrskozzy написал(а):
DedMorozzz
жду)
нашёл какой-то модификатор который делает точки нежадными, поэксперементирую с ним..


_____________
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.