[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Как строить регулярное выражение.
Joker
И так я так долго пытался этого избежать если нужно было или просил кого то написать регулярку) К счастью есть друзья которые делали это и не один раз)
Но уже стыдно становиться просить вот все таки решился научиться этому)

И так начну от простого к сложному.

для начала хочу достать из строки всё кроме определенного слова.

делаю так
PHP
<?php
$pattern 
'#[^\[code\]]*#';
echo 
$text "12code[code]56code";
echo 
"<br/>",htmlspecialchars($pattern);
preg_match_all($pattern,$text,$array);
echo 
"<pre>";
print_r($array);
echo 
"</pre>";
 


Получаю следующее

Код

12code[code]56code
#[^\[code\]]*#
Array
(
   [0] => Array
       (
           [0] => 12
           [1] =>
           [2] =>
           [3] =>
           [4] =>
           [5] =>
           [6] =>
           [7] =>
           [8] =>
           [9] =>
           [10] =>
           [11] => 56
           [12] =>
           [13] =>
           [14] =>
           [15] =>
           [16] =>
       )

)


Но хочу получить
Код

12code

и
Код

56code




Спустя 1 минута, 40 секунд (1.05.2009 - 19:31) Joker написал(а):
мне нужно чтоб сравнивалось всё слово а не перебор симолов может есть символы которые обьединяют?

Спустя 15 минут, 50 секунд (1.05.2009 - 19:46) hara написал(а):

Спустя 1 минута, 49 секунд (1.05.2009 - 19:48) Joker написал(а):
Ну во первых я незнаю англисский))

А во вторых уже читал это:

это

это

это

и то что в этом разделе в топике закреплено

Спустя 12 минут, 12 секунд (1.05.2009 - 20:00) hara написал(а):
Ну я уверен что все знаю что Language будет Язык, а Russian будет Русский
и что при желании по той ссылке которую я дал, можно выбрать русский язык из
выпадающего списка. (Да и в url видно en можно попробовать поставить ru)
Это было первое.

А второе это то что по тем ссылкам что ты привёл, есть ответ на твой вопрос.

PHP
$pattern '#([0-9]+code)#';
echo 
$text "12code[code]56code";

Спустя 27 минут, 3 секунды (1.05.2009 - 20:27) Sylex написал(а):
Joker
Приведенный пример hara - есть извлечение - "цифр и code", а не все кроме слова [code]

Цитата ("Joker")
$pattern = '#[^\[code\]]*#';


ты не правильно понял как работает [^...]
Здесь нельзя указывать СЛОВА! Здесь указываются исключающие символы!

К примеру:
[^a-d]
исключает все символы кроме a,b,c,d

но нельзя писать
[^slovo]

в таком случае просто будет искаться любая буква кроме из набора перечисленных букв - s l o v

Спустя 4 минуты, 11 секунд (1.05.2009 - 20:32) Joker написал(а):
Но как то сгрупировать то можно??

Если бы стояла такая задача)) я бы вообще str_replace кикнул из строки это слово и готово)) но охото понять как такое делаеться с регулярками...

Вот так попробовал

PHP
<?php
$pattern 
'#[^\[][^c][^o][^d][^e][^\]]#';
echo 
$text "12code[code]56code";
echo 
"<br/>",htmlspecialchars($pattern);
preg_match_all($pattern,$text,$array);
echo 
"<pre>";
print_r($array);
echo 
"</pre>";


выводит

Код

Array
(
   [0] => Array
       (
           [0] => 12code
           [1] => code]5
       )

)


тобишь начало я достал а конец как...

Спустя 3 минуты, 37 секунд (1.05.2009 - 20:35) hara написал(а):
Вообще так будешь очень долго и нудно учить RE если не читать мануал.
Но дело твоё конечно.

Круглые скобки группируют символы... я их там в примере не зря писал.. без них пример работает..

Спустя 3 минуты (1.05.2009 - 20:38) Joker написал(а):
Ты достаешь имеено то что в этой строке, а нужно достать все кроме [code]

тобишь на это работать не будет
PHP
$text = "строка[code]строка";



И мануал я проччитал но чот такова не нашел...

Спустя 2 минуты, 37 секунд (1.05.2009 - 20:41) hara написал(а):
да не будет, я знаю)

почитай ещё раз. и попоробуй сам. всё, уже неинтересно.

Спустя 1 минута, 19 секунд (1.05.2009 - 20:42) Joker написал(а):
Цитата (hara @ 1.05.2009 - 17:41)
да не будет, я в знаю.


А зачем тогда публикуешь если знаешь что не работоспособное?)

Цитата (Sylex @ 1.05.2009 - 17:27)
Здесь нельзя указывать СЛОВА! Здесь указываются исключающие символы!


тобишь осуществить это невозможно с помощью регулярки???

Спустя 11 минут, 45 секунд (1.05.2009 - 20:54) Joker написал(а):
Во так работает)))
PHP
$pattern '#([\n\s\S]*)(\[code\])([\n\s\S]*)#';

Спустя 5 минут, 4 секунды (1.05.2009 - 20:59) Sylex написал(а):
Joker
ага, попробуй вот для такого текста smile.gif
echo $text = "bret[code]sylex[code]code[code]alex";

Спустя 38 секунд (1.05.2009 - 21:00) Sylex написал(а):
Joker
и смысл в твоих \n\s\S ? smile.gif

Спустя 10 минут, 24 секунды (1.05.2009 - 21:10) Joker написал(а):
Цитата (Sylex @ 1.05.2009 - 17:59)
bret[code]sylex[code]code[code]alex


Ну да не пашет(

Цитата (Sylex @ 1.05.2009 - 18:00)
и смысл в твоих \n\s\S ?


Незнаю в какойто регулярке высмотрел))

Спустя 8 минут, 59 секунд (1.05.2009 - 21:19) kirik написал(а):
Цитата (Joker @ 1.05.2009 - 13:10)
Незнаю в какойто регулярке высмотрел))

Попробуй узнать и нам рассказать smile.gif

Спустя 1 минута, 25 секунд (1.05.2009 - 21:20) Joker написал(а):
Если такую вроде простую задачу так сложно сделать что же тогда будет на сложном уровне blink.gif

\s - если вы в условии поиска поставите друг за другом символ обратного слеша, а после него сразу букву s, то таким образом вы опишите либо пробел, либо символ табуляции. Конечно в условии поиска можно поставить пробел так, как вы его обычно ставите на письме, но запись [a-z\s] будет намного понятнее и читабельней чем [a-z ], с первого взгляда видно, что в первый символьный класс входит пробел, а вот со вторым символьным классом надо присмотреться, а так как регулярные выражения итак представляют для многих набор значков, то пропустить пробел, поставленный таким образом будет очень просто. Внимательно используйте этот спецсимвол, так в дополнении к тому, что он совпадает с пробелом и табулятором, он совпадет также с символом новой строки.
\S - скажу просто, что в своем большинстве это видимые символы, т.е. все, что не совпадает с \s



Если своими словами то вообще все символы которые только возможно достаёт. Если я правильно понел.

Спустя 10 минут, 43 секунды (1.05.2009 - 21:31) Sylex написал(а):
PHP
$pattern '#(.*?)(\[code\])(\w*)#';


кривавато ohmy.gif tongue.gif

Спустя 32 минуты, 49 секунд (1.05.2009 - 22:04) kirik написал(а):
Цитата (Joker @ 1.05.2009 - 13:53)
нужна регулярка которая выцепит весь текст кроме того что заключон в теги [CОDE] and [/CОDE]

Какие-то странные задачи ты себе ставишь. Зачем вытаскивать весь текст "кроме", когда можно в исходном тексте это "кроме" просто удалить?

Спустя 1 минута, 2 секунды (1.05.2009 - 22:05) Joker написал(а):
Ну допустим нужно весь текст кроме этого обработать функцией и вернуть обратно....

Спустя 1 минута, 30 секунд (1.05.2009 - 22:07) Joker написал(а):
Цитата (Sylex @ 1.05.2009 - 18:31)
PHP
$pattern = '#(.*?)(\[code\])(\w*)#';


кривавато ohmy.gif tongue.gif

Переносы если есть то перестаёт работать... пробовал \n поставить чот не срабатывает(

Спустя 2 минуты, 30 секунд (1.05.2009 - 22:09) kirik написал(а):
Ну очищаешь текст от лишнего и передаешь в функцию (или же в самой функции очищаешь). При этом ты не будешь париться при составлении регэкспа, да и составленный не сложный регэксп будет работать быстрее, чем сложный с "все кроме".

Спустя 34 минуты, 4 секунды (1.05.2009 - 22:43) Joker написал(а):
Ну я как пример привел)) я просто хочу научиться их делать)) И вот что в голову всбрело то и пытаюсь делать.

Спустя 3 минуты, 9 секунд (1.05.2009 - 22:46) Joker написал(а):
Вот задачка как написать регулярку которая бы выевляло это нарушение

"При оформлении сообщения с программным кодом используйте обрамляющие тэги."

Спустя 19 минут, 44 секунды (1.05.2009 - 23:06) kirik написал(а):
Цитата (Joker @ 1.05.2009 - 14:46)
"При оформлении сообщения с программным кодом используйте обрамляющие тэги."

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

Давай другое задание:
Нужно составить регулярку, которая будет вытаскивать из текста телефонные номера. Номера могут быть такими (допустим):
Цитата
dd-dd-dd
(ddd)-dd-dd-dd
+d-ddd-dd-dd-dd
dd dd dd
ddddddd

Спустя 10 минут, 9 секунд (1.05.2009 - 23:16) Joker написал(а):
Так?
PHP
$pattern '#[\-0-9 \(\)\+]{7,14}#';

Спустя 1 минута, 43 секунды (1.05.2009 - 23:18) kirik написал(а):
Цитата (Joker @ 1.05.2009 - 15:16)
Так?

"d-d-d-d-d-d" и "ddddd---" тоже загребешь?

Спустя 9 часов, 19 минут, 58 секунд (2.05.2009 - 08:38) Sylex написал(а):
Joker
да первый пример убогий, вообще решить проще так:
PHP
$s = explode('[code]', $text);


а переносы строк чтоб игнорировать - модификатор s

Спустя 7 часов, 25 минут, 32 секунды (2.05.2009 - 16:03) Joker написал(а):
Цитата (Sylex @ 2.05.2009 - 05:38)
Joker
да первый пример убогий, вообще решить проще так:


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

Спустя 1 час, 32 минуты, 44 секунды (2.05.2009 - 17:36) Sylex написал(а):
Joker
да я понял, вон решай задачку, что дал тебе kirik.
Многому научишься wink.gif

Спустя 9 минут, 11 секунд (2.05.2009 - 17:45) Joker написал(а):
Да я думаю.... придумать немогу...

Спустя 6 часов, 54 минуты, 17 секунд (3.05.2009 - 00:40) Joker написал(а):
Напишите мне хотяб примерно как должна строиться логика.... пажалусто rolleyes.gif не регулярку а логика а то я умру ща... вообще дойти не может)

Спустя 37 минут, 13 секунд (3.05.2009 - 01:17) kirik написал(а):
Ну для начала держи темплитку:
PHP
header('Content-Type: text/plain; charset=utf-8');

$text = 'Lorem Ipsum is simply dummy 93-15-22 text of the printing and typesetting industry.
Lorem Ipsum has been the industry standard (324)-43-55-12 dummy text ever since 232931522 the
1500s, when an unknown printer took a galley of type and  scrambled it to 39-32-13-33 make a
type specimen book. It +1-416-93-14-43 has survived not 92 15 22 only five
centuries, but 54-23 also the leap into electronic typesetting, remaining
essentially 416-96-44-43 unchanged. It was popularised in the 1960s with the release
of 9060903 Letraset sheets containing Lorem Ipsum passages, and more recently with desktop
publishing software like Aldus PageMaker including versions of Lorem Ipsum.'
;

$pattern = '/????/';

preg_match_all($pattern, $text, $out);
print_r($out);

exit(
'
Result:
    Array
    (
        [0] => 93-15-22
        [1] => (324)-43-55-12
        [2] => +1-416-93-14-43
        [3] => 92 15 22
        [4] => 9060903
    )'
);


Результат который должен получиться выводится ниже.
Теперь расскажи какую логику придумал ты, а мы поправим если что smile.gif

ЗЫ. Из текста нужно вытащить _только_ номера видов:

Цитата
dd-dd-dd
(ddd)-dd-dd-dd
+d-ddd-dd-dd-dd
dd dd dd
ddddddd

Спустя 6 минут, 47 секунд (3.05.2009 - 01:24) Joker написал(а):
1. В начале может идти (ххх)- это или +х-ххх- или х

после
2. три пары из двух цифр между парами может быть максимум один проблел или черточка или нечего.


x - это интервал цифр 0-9

Спустя 4 минуты, 50 секунд (3.05.2009 - 01:28) kirik написал(а):
Ну логичная у тебя логика smile.gif Теперь пиши регэксп smile.gif

ЗЫ. Мне проще искать сначала чего общего между искомыми значениями (3 пары чисел с разделителями или без), и потом один из двух префиксов (или без префикса). Но это не имеет значения smile.gif Как удобнее.

Спустя 3 минуты, 9 секунд (3.05.2009 - 01:32) Joker написал(а):
Ну дак вот в любом примере будет

Цитата (Joker @ 2.05.2009 - 22:24)
2. три пары из двух цифр между парами может быть максимум один проблел или черточка или нечего.


А перед ним может быть а может и не быть

Цитата (Joker @ 2.05.2009 - 22:24)
1. В начале может идти (ххх)- это или +х-ххх- или х



Спустя 6 минут, 34 секунды (3.05.2009 - 01:38) kirik написал(а):
Ну все правильно (проме последнего "или х"). Дело за малым smile.gif

Спустя 4 минуты, 7 секунд (3.05.2009 - 01:42) Joker написал(а):
Цитата (kirik @ 2.05.2009 - 22:38)
Ну все правильно (проме последнего "или х"). Дело за малым



Цитата

dd-dd-dd
(ddd)-dd-dd-dd
+d-ddd-dd-dd-dd
dd dd dd
ddddddd


а последний номер из 7 сиволов как достанеш? тогда?

Спустя 3 минуты, 22 секунды (3.05.2009 - 01:46) kirik написал(а):
Цитата (Joker @ 2.05.2009 - 17:42)
а последний номер из 7 сиволов как достанеш? тогда?

Сори, там 6 чисел должно было быть smile.gif Прости слепого. rolleyes.gif Но не суть, пусть будет 7. Тогда твое "или х" вполне уместно.

Давай регэксп пиши cool.gif

Поправил задачу

Спустя 3 минуты, 49 секунд (3.05.2009 - 01:49) Joker написал(а):
Ща в шоке наверно будите но это РАБОТАЕТ)))

PHP
$pattern '/(?:\(\d{3}\)\-{1})(?:\d{2}\-\d{2}\-\d{2})|(?:\+\d{1}\-\d{3}\-)(?:\d{2}\-\d{2}\-\d{2})|(?: {1}\d{2}\-{0,1} {0,1}\d{2}\-{0,1} {0,1}\d{2} {1})/';

Спустя 3 минуты, 1 секунда (3.05.2009 - 01:52) kirik написал(а):
Цитата (Joker @ 2.05.2009 - 17:49)
Ща в шоке наверно будите но это РАБОТАЕТ)))

1. Не работает (точнее не до конца, сравни с результатом "Result:")
2. Что означает "?:"? smile.gif
3. Можно сделать в 3 раза короче

Спустя 58 секунд (3.05.2009 - 01:53) Joker написал(а):
Цитата (kirik @ 2.05.2009 - 22:52)
2. Что означает "?:"?


чтоб скобка не сохронялась)))

Спустя 51 секунда (3.05.2009 - 01:54) Joker написал(а):
ща попробую покороче)
у меня работает а я прям твою темл скопировал.

я вместо preg_match использовал preg_match_all sad.gif

Результат

HTML
Array
(
[0] => Array
(
[0] => 93-15-22
[1] => (324)-43-55-12
[2] => +1-416-93-14-43
[3] => 92 15 22
[4] => 906090
)

)

Result:
Array
(
[0] => 93-15-22
[1] => (324)-43-55-12
[2] => +1-416-93-14-43
[3] => 92 15 22
[4] => 906090
)

Спустя 17 минут, 6 секунд (3.05.2009 - 02:11) Joker написал(а):
чот не получаеться...

Спустя 2 минуты, 18 секунд (3.05.2009 - 02:14) kirik написал(а):
Цитата (Joker @ 2.05.2009 - 18:11)
чот не получаеться...

Думай! Это просто. Проще чем ты думаешь smile.gif

Спустя 3 часа, 19 минут, 50 секунд (3.05.2009 - 05:33) Alchemist написал(а):
kirik, На самом деле, мне кажется, что при условии строгого следования шаблону задача гораздо менее тривиальна чем кажется. По крайней мере мое решение всего лишь чуть-чуть короче чем у Джокера.

Впрочем, учитывая что сейчас уже полшестого утра я могу и ошибаться, но тем не менее было бы интересно увидеть и твой вариант решения smile.gif

Подумал и решил добавить свой более жесткий вариант Lorem Ipsum.
PHP
$text = '1234567 Lorem Ipsum 1234-56 is simply dummy 93-15-22 text of the printing and "68-47-21" typesetting industry.
Lorem Ipsum has been 666666 the industry standard (324)-43-55-12 dummy text ever since 232931522 the
1500s, when 12-12 12 an unknown printer took a galley of type and  scrambled it to 39-32-13-33 make a
type specimen book. It +1-416-93-14-43 has survived not 92 15 22 only five
centuries, but 54-23 also the leap into electronic (123)-45 35-78 typesetting, remaining
essentially 416-96-44-43 unchanged. It was popularised in the 1960s with the release
of 9060903 Letraset sheets containing Lorem Ipsum +1-333-22 22 22 passages, and more recently with desktop
publishing software like 98 98-98 Aldus PageMaker including 321 21 21 versions of Lorem Ipsum. 98-76-54'
;

$pattern = '/???/';

preg_match_all($pattern, $text, $out);
print_r($out);

exit(
'
Result:
    Array
    (
    [0] => Array
        (
            [0] => 1234567
            [1] => 93-15-22
            [2] => 68-47-21
            [3] => (324)-43-55-12
            [4] => +1-416-93-14-43
            [5] => 92 15 22
            [6] => 9060903
            [7] => 98-76-54
        )
    )'
);


Update: Ок, беру свои слова обратно. Я все еще не вижу способа сильно сократить регу, но, действительно, существует вариант гораздо более простой чем тот что привиделся мне утром в программистском бреду smile.gif

Спустя 14 часов, 51 минута, 12 секунд (3.05.2009 - 20:25) Joker написал(а):
А если так...
PHP
$pattern = '#\s(?:\(\d{3}\)\-|\+\d\-\d{3}\-|\d|)\d{2}(?:\s|\-|)\d{2}(?:\s|\-|)\d{2}\s#';



Если правильно то жду посложнее задачку))

Спустя 44 минуты, 13 секунд (3.05.2009 - 21:09) Joker написал(а):
Цитата (Alchemist @ 3.05.2009 - 02:33)

Подумал и решил добавить свой более жесткий вариант Lorem Ipsum.
PHP
$text = '1234567 Lorem Ipsum 1234-56 is simply dummy 93-15-22 text of the printing and \\"68-47-21\\" typesetting industry.
Lorem Ipsum has been 666666 the industry standard (324)-43-55-12 dummy text ever since 232931522 the
1500s, when 12-12 12 an unknown printer took a galley of type and  scrambled it to 39-32-13-33 make a
type specimen book. It +1-416-93-14-43 has survived not 92 15 22 only five
centuries, but 54-23 also the leap into electronic (123)-45 35-78 typesetting, remaining
essentially 416-96-44-43 unchanged. It was popularised in the 1960s with the release
of 9060903 Letraset sheets containing Lorem Ipsum +1-333-22 22 22 passages, and more recently with desktop
publishing software like 98 98-98 Aldus PageMaker including 321 21 21 versions of Lorem Ipsum. 98-76-54'
;

$pattern = '/???/';

preg_match_all($pattern, $text, $out);
print_r($out);

exit(
'
Result:
    Array
    (
    [0] => Array
        (
            [0] => 1234567
            [1] => 93-15-22
            [2] => 68-47-21
            [3] => (324)-43-55-12
            [4] => +1-416-93-14-43
            [5] => 92 15 22
            [6] => 9060903
            [7] => 98-76-54
        )
    )'
);



Я попробовал переделать регулярку и мне достёт такие значения
HTML
Array
(
[0] => Array
(
[0] => 1234567
[1] => 1234-56
[2] => 93-15-22
[3] => "68-47-21"
[4] => 666666
[5] => (324)-43-55-12
[6] => 12-12 12
[7] => +1-416-93-14-43
[8] => 92 15 22
[9] => (123)-45 35-78
[10] => 9060903
[11] => +1-333-22 22 22
[12] => 98 98-98
[13] => 321 21 21
[14] => 98-76-54
)

)

Регулярка.
PHP
$pattern = '#(?:^|\s|\s\")(?:\(\d{3}\)\-|\+\d\-\d{3}\-|\d|)\d{2}(?:\s|\-|)\d{2}(?:\s|\-|)\d{2}(?:\s|\"\s|$)#';


И у меня вопрос почему ты своеё регуляркой не достаешь такие номера
[1] => 1234-56
[3] => 666666
[5] => 12-12 12
[10] => +1-333-22 22 22
[11] => 98 98-98
[12] => 321 21 21


также тоже возможно написать номер...

Спустя 35 минут, 23 секунды (3.05.2009 - 21:44) kirik написал(а):
Цитата (Alchemist @ 2.05.2009 - 21:33)
Ок, беру свои слова обратно. Я все еще не вижу способа сильно сократить регу, но, действительно, существует вариант гораздо более простой чем тот что привиделся мне утром в программистском бреду

Да, погорячился я насчет шаблонов на ночь глядя smile.gif Действительно для начала это не очень простая задачка. Благодоря твоему "более жесткому варианту Lorem Ipsum" я увеличил немного свой вариант, но он все равно короче чем у Jokerа. rolleyes.gif

Цитата (Joker @ 3.05.2009 - 13:09)
Я попробовал переделать регулярку и мне достёт такие значения

Ты молодец если сам писал! Но
Цитата (Joker @ 3.05.2009 - 13:09)
И у меня вопрос почему ты своеё регуляркой не достаешь такие номера
[1] => 1234-56
[3] => 666666
[5] => 12-12 12
[10] => +1-333-22 22 22
[11] => 98 98-98
[12] => 321 21 21

1234-56 (12-12 12/98 98-98) - это может быть например дом-квартира. Да много разных случаев бывает.

Попробуй отсеять номера 1234-56, 12-12 12, 98 98-98 (Прим. "Обратные ссылки" отсюда помогут)

Спустя 19 минут, 10 секунд (3.05.2009 - 22:03) Joker написал(а):
Цитата (kirik @ 3.05.2009 - 18:44)
Попробуй отсеять номера 1234-56, 12-12 12, 98 98-98 (Прим. "Обратные ссылки" отсюда помогут)


вот так обрезал

PHP
$pattern '#(?:^|\s|\s\")(?:\(\d{3}\)\-|\+\d\-\d{3}\-|\d|)\d{2}(\s|\-|)\d{2}\1\d{2}(?:\s|\"\s|$)#';


Но сразу появился вопрос как образать вот такие номера
Код
+1-333-22 22 22


Спустя 5 минут, 26 секунд (3.05.2009 - 22:09) Joker написал(а):
тобишь что строит между 1-333 и записать в линк а дальше если линк есть то использовать его а если нету то использовать (\s|\-|)

Цитата (kirik @ 3.05.2009 - 18:44)
Ты молодец если сам писал!


Конечно сам))) Хотя у меня была идея в поисковике это найти но я не нашел))) И очень рад что не нашел т.к. очень многое столо ясно.

Спустя 43 минуты, 54 секунды (3.05.2009 - 22:53) Grazor написал(а):
я вот такую штуку накидал. в $out[0] как раз получается то что нужно
PHP
$pattern '/(^|\s)((\(\d{3}\)-|\+\d-\d{3}-)?(\d{2}(-|\s)?){3}(\d)?)(\s|$)/';

осталось что-то придумать с номерами типа "1234-56, 12-12 12". полез читать маны

Спустя 2 минуты, 30 секунд (3.05.2009 - 22:55) Joker написал(а):
Цитата (Grazor @ 3.05.2009 - 19:53)
я вот такую штуку накидал. в $out[0] как раз получается то что нужно
PHP
$pattern = '/(^|\s)((\(\d{3}\)-|\+\d-\d{3}-)?(\d{2}(-|\s)?){3}(\d)?)(\s|$)/';

осталось что-то придумать с номерами типа "1234-56, 12-12 12". полез читать маны

Я час назад выложил то что обрезает эти номера)))

Выше читай. там легко.

И твоя регулярка вот такой номер пропустит.

"68-47-21"

Спустя 5 минут, 35 секунд (3.05.2009 - 23:01) Grazor написал(а):
Цитата (Joker @ 3.05.2009 - 22:55)
И твоя регулярка вот такой номер пропустит.

"68-47-21"


нет, не пропускает. завтра покопаюсь с "обратными ссылками"

(\d)? это наш 7й символ. хотя она получит и такую штуку "(324)-43-55-123"

Спустя 3 минуты (3.05.2009 - 23:04) Joker написал(а):
Цитата (Grazor @ 3.05.2009 - 20:01)
нет, не пропускает. завтра покопаюь с "обратными ссылками"


Ты прям с ковычками напиши, и пропустит!) И еще ты многое говоришь ему запомнить хотя запоминать не нужно...

Спустя 5 минут, 7 секунд (3.05.2009 - 23:09) Grazor написал(а):
Цитата (Joker @ 3.05.2009 - 23:04)
Ты прям с ковычками напиши, и пропустит!)

понял, к чему ты. потыркавшись с ?: и учтя кавычки, получил такую штуку
PHP
$pattern '/(?:^|\s|\")((?:\(\d{3}\)-|\+\d-\d{3}-)?(?:\d{2}(?:-|\s)?){3}\d?)(?:\s|\"|$)/';

Спустя 5 минут, 31 секунда (3.05.2009 - 23:14) Joker написал(а):
осталось тебе только вот такие номера отсортировать)

12-12 12
98 98-98

И еще бы вот такие

(123)- 45 35 78

Спустя 4 минуты, 6 секунд (3.05.2009 - 23:19) Grazor написал(а):
кстати, вставил твою регулярку, добавив в исходный текст "68-47-21". получилась такая штука
PHP
Array
(
    [0] => Array
        
(
            [0] =>  93-15-22 
            
[1] =>  (324)-43-55-12 
            
[2] =>  +1-416-93-14-43 
            
[3] =>  92 15 22 
            
[4] =>  9060903 
            
[5] =>  "68-47-21" 
        
)

    [1] => Array
        
(
            [0] => -
            [1] => -
            [2] => -
            [3] =>  
            
[4] => 
            
[5] => -
        )

)


UPD а над теми случаями подумаю, спасибо

Спустя 8 минут, 25 секунд (3.05.2009 - 23:27) Joker написал(а):
12-12 12
98 98-98

Ну вот эти случаи может посмотреть из моей регулярки.

А вод над этим

(123)-45 35 78

если придумаешь то очень интересно было бы посмотреть т.к. немогу не как отсеить.

Спустя 1 час, 24 минуты, 45 секунд (4.05.2009 - 00:52) kirik написал(а):
Цитата (Joker @ 3.05.2009 - 15:27)
А вод над этим (123)-45 35 78 если придумаешь то очень интересно было бы посмотреть т.к. немогу не как отсеить.


Тоже в сторону обратных ссылок смотри. Чуть-чуть перекрои свою регулярку.

ЗЫ. Результат должен быть такой (с использованием текста, который дал Alchemist):
PHP
Array
(
    [0] => 1234567
    
[1] => 93-15-22
    
[2] => 68-47-21
    
[3] => (324)-43-55-12
    
[4] => +1-416-93-14-43
    
[5] => 92 15 22
    
[6] => 9060903
    
[7] => 98-76-54
)

Спустя 17 часов, 58 минут, 49 секунд (4.05.2009 - 18:51) Joker написал(а):
Цитата (kirik @ 3.05.2009 - 21:52)
ЗЫ. Результат должен быть такой (с использованием текста, который дал Alchemist):


Да но он отсеивает номера из 6 цифр исли написаны они без пробелом это не правильно....

Спустя 1 час, 4 минуты, 9 секунд (4.05.2009 - 19:55) kirik написал(а):
Цитата (Joker @ 4.05.2009 - 10:51)
Да но он отсеивает номера из 6 цифр исли написаны они без пробелом это не правильно....

Почему? Мы ведь сейчас к этим шаблонам регулярку составляем:
Цитата
dd-dd-dd (три пары чисел разделенные тире)
(ddd)-dd-dd-dd (три числа в скобках, тире, три пары чисел разделенные тире)
+d-ddd-dd-dd-dd (плюс число, тире, три числа, тире, три пары чисел разделенные тире)
dd dd dd (три пары чисел разделенные пробелом)
ddddddd (семь чисел подряд)

Спустя 1 минута, 4 секунды (4.05.2009 - 19:56) Joker написал(а):
Цитата (kirik @ 4.05.2009 - 16:55)
Почему? Мы ведь сейчас к этим шаблонам регулярку составляем:


Да но довай уж сразу ко всем стараться состовлять)))

Спустя 13 минут, 28 секунд (4.05.2009 - 20:09) kirik написал(а):
Давай пока к этим smile.gif

Спустя 2 дня, 7 часов, 22 минуты, 12 секунд (7.05.2009 - 03:31) E1ion написал(а):
PHP
$pattern='/(\+\d)?.{0-2}\d{3}?(.)?\d{2}(//1\d{2}){2}|\d{7}/';[s]

неужели я действительно понял регулярные выражения за 2е ночи? biggrin.gif

Спустя 40 минут, 14 секунд (7.05.2009 - 04:12) kirik написал(а):
E1ion, а ты сам пробовал его запустить?


Joker, забил уже? smile.gif

Спустя 3 часа, 4 минуты, 36 секунд (7.05.2009 - 07:16) Joker написал(а):
Цитата (kirik @ 7.05.2009 - 01:12)
Joker, забил уже?

да я тут на несколько дней раслубился) с пивасиком)) так что регулярки не регулярились))

Спустя 16 минут, 4 секунды (7.05.2009 - 07:32) kirik написал(а):
С пивасиком должно еще круче регуляриццо! Пиво повышает регуляротивный процесс smile.gif

Спустя 1 день, 7 часов, 27 минут, 56 секунд (8.05.2009 - 15:00) E1ion написал(а):
Цитата
ты сам пробовал его запустить?

неа biggrin.gif
PHP
$pattern='/((\+\d)?.{0-2}?\d{3}.)?\d{2}(.)\d{2}//2\d{2}|\d{7}/';

так вроде получше rolleyes.gif

Спустя 4 часа, 43 минуты, 3 секунды (8.05.2009 - 19:43) kirik написал(а):
Цитата (E1ion @ 8.05.2009 - 07:00)
неа

Ну попробуй. Только сильно не огорчайся smile.gif

Спустя 40 минут, 18 секунд (8.05.2009 - 20:24) twin написал(а):
Цитата
Пиво повышает регуляротивный процесс

Перебор пива может привести к рЫгулярВотивному процессу. Как и неуёмная страсть к регулярным выражениям biggrin.gif

Спустя 19 дней, 11 часов, 50 минут, 38 секунд (28.05.2009 - 08:14) kirik написал(а):
Joker
стопудов забил smile.gif А я напомню, у тебя незавершенная задача tongue.gif

Спустя 1 месяц, 28 дней, 14 часов, 50 минут, 29 секунд (26.07.2009 - 23:05) Oyeme написал(а):
Как я понел тебе надо достать "всё" кроме определённого слова..

например:

PHP
$string 'The quick brown fox jumped over the lazy dog.';
  
$patterns[0] = '/quick/';
  
$patterns[1] = '/brown/';
  
$patterns[2] = '/fox/';

$replacements[2] = '';
$replacements[1] = '';
$replacements[0] = '';

echo 
preg_replace($patterns$replacements$string);

Спустя 13 минут, 31 секунда (26.07.2009 - 23:18) kirik написал(а):
Oyeme
Почитай весь трэд полностью..
Если что, вот задача, вот такие должны получаться результаты.

Спустя 2 часа, 45 минут, 14 секунд (27.07.2009 - 02:04) PandoraBox2007 написал(а):
PHP
$text = "строка[code]строка[code]строка[code]строка[code]строка[code]строка";
if (!strpos($text, "[code]"))
{
    die("Ошибка нет перечесления.");
}
$data = explode("[code]", $text);
print_r($data); // Array ( [0] => строка [1] => строка [2] => строка [3] => строка [4] => строка [5] => строка )


smile.gif тут регулярки не нужны, они медленные, перечисление слов ведь.

Спустя 1 час, 19 минут, 32 секунды (27.07.2009 - 03:23) kirik написал(а):
Да ё-мае.. Вы топик читать будете или нет? При чем тут "тут регулярки не нужны, они медленные", когда в названии топика написано "Как строить регулярное выражение., Учусь от простого к сложному"??

Спустя 1 час, 9 минут (27.07.2009 - 04:32) PandoraBox2007 написал(а):
PHP
$text = "строка[code]строка[code]строка[code]строка[code]строка[code]строка";
if (!preg_match("/\[code\]/i",$text))
{
    die("Ошибка нет перечесления.");
}
$match = preg_split("/\[code\]/is", $text);
print_r($match); // Array ( [0] => строка [1] => строка [2] => строка [3] => строка [4] => строка [5] => строка )


а стоит ли применять новую модель велосипеда? для резки элементов smile.gif
Быстрый ответ:

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