Вопрос по регулярным выражениям
6970 сообщений
#15 лет назад
Цитата ("frig"):Начинать с написания своего шаблонизатора - более чем оригинально, на мой взгляд.
Ну, с чего-то же надо начинать... Я не могу учиться на абстрактных примерах. А тут - практическая задача. И несложная.

Я VBA в своё время так изучал - писал обработчик телепрограммы для вёрстки в газете.
6970 сообщений
#15 лет назад
Цитата ("neadekvat"):Либо я тут в теме чего-то упустил, либо вот:
Так это и было. Только в этом случае берётся скобка не после "Сайт", а последняя скобка в строке - в чём и была проблема. Про "жадность" я тогда ещё не знал.
6970 сообщений
#15 лет назад
Цитата ("neadekvat"):Зато вы решили два вопроса:
1. Узнали про U
2. Перешли на preg_*
Не только.

Кстати, у Вас в выражении ещё одна ошибка. Адрес сайта может состоять не только из букв и точки.

6970 сообщений
#15 лет назад
Цитата ("neadekvat"):Цитата ("voron_76"):Кстати, у Вас в выражении ещё одна ошибка. Адрес сайта может состоять не только из букв и точки.
Это не ошибка, а невнимательность. Думаю, добавить дефис и нижнее подчеркивание совсем не сложно.
А чем плох ]?
И тут не только дефис и подчёркивание. Ссылки ведь могут состоять вообще из любых символов (скажем, в ссылках на статьи Википедии могут быть и русские буквы).
6970 сообщений
#15 лет назад
Цитата ("neadekvat"):Цитата ("voron_76"):А чем плох ]?
Каждый делает так, как ему удобно
Удобство - это одно... я вот использовал eregi, потому что удобно - а оказалось, что его вообще использовать нельзя.
Есть у ] какие-нибудь фатальные недостатки, из-за которых его лучше не использовать, а перечислять все возможные символы?
3240 сообщений
#15 лет назад
Цитата ("neadekvat"):Это не ошибка, а невнимательность. Думаю, добавить дефис и нижнее подчеркивание совсем не сложно.
Это именно ошибка. Пожалуйста почитайте спецификацию, что еще может быть в URL.
Там очень много чего может быть, помимо латинских букв, точек, дефиса и символа подчеркивания. Подсказка: ссылка
И еще пожалуйста еще не забывайте про последнюю российскую моду относительно доменных имен в кириллице.
А вот например ] лишен этих недостатков.
P.S. Я бы делал бы эту задачу абсолютно по-другому, не изобретая велосипед (так как если далеть все с нуля, и при этом делать правильно, по спекам, задача вовсе не так проста, как кажется)... Но это уже другая тема.
6970 сообщений
#15 лет назад
Цитата ("tvv"):P.S. Я бы делал бы эту задачу абсолютно по-другому, не изобретая велосипед (так как если далеть все с нуля, и при этом делать правильно, по спекам, задача вовсе не так проста, как кажется)...
А в чём недостаток (или неуниверсальность) моего решения?
3240 сообщений
#15 лет назад
Цитата ("voron_76"):А в чём недостаток (или неуниверсальность) моего решения?
Первый недостаток — само наличие Вашего решения. Так как это велосипед, который уже давно сделан другими, причем очень хорошо сделан, и неоднократно. Лучше тратить свое время на более интересные задачи, чем на эту, которая без предварительного глубокого исследования спецификаций все равно будет иметь заведомо худшую реализацию.
Второй недостаток — избыточность:
— то, что Вы сделали с использованием цикла, условия и двух регекспов, можно было бы сделать одним лишь preg_replace.
— зачем Вы взяли в круглые скобки ( http: )? Вы ничего от этого не получили, лишь создали лишнюю группу.
— в Вашем случае нет никакого смысла вообще даже касаться ограничения жадности, так как это плохо влияет на производительность. Вместо .+? вполне достаточно было бы использовать +
— обрабатывать текстовый файл построчно, особенно выбранным Вами способом, не оптимально с точки зрения производительности.
Далее, неуниверсальность:
— по условию Вашей задачи может ли быть, что используемый протокол может быть не только http://, но и https:// или ftp:// и т.д.?
— по условию Вашей задачи может ли быть, что примечание в круглых скобках отделяется от URL не просто пробелом, а например двумя пробелами, или табуляцией, или даже переводом строки?
— по условию Вашей задачи может ли быть, что примечание в круглых скобках займет несколько строк?
— по условию Вашей задачи может ли быть, что примечание в круглых скобках может содержать вложенные круглые скобки, или например символ "<", или даже подстроку "</a>", и т.д.?
— по условию Вашей задачи могут ли допускаться ошибки например людей, которые составляют исходные тексты? Например, если забудут закрывающую скобку поставить, и т.д.?
— не проверяется корректность URL. Скажем, Ваш скрипт трансформирует текст 'Какую схему использовать, HTTP:? (или нет?) ...' => 'Какую схему использовать, <a href="?">или нет?</a> ...'.
В общем, я мог бы сходу добавить где-то пару десятков подобных же пунктов, только смысла нет. Надеюсь лишь донести мысль, есть ли вообще смысл заниматься подобной черной низкоуровневой работой.
6970 сообщений
#15 лет назад
Цитата ("tvv"):Цитата ("voron_76"):А в чём недостаток (или неуниверсальность) моего решения?
Первый недостаток — само наличие Вашего решения. Так как это велосипед, который уже давно сделан, причем очень хорошо сделан. Лучше тратить свое время на более интересные задачи, чем на эту, которая без предварительного исследования спецификаций все равно будет иметь заведомо худшую реализацию.
У меня есть одна интересная задача, которая даже уже решена (на VBA) и которую я давно хочу перевести на PHP. Но она слишком сложна, чтобы решать её вот так, с нуля, изучая по ходу дела функции. Поэтому для начала - вот такая несложная штука.
Цитата:
Второй недостаток — избыточность:
— то, что Вы сделали с использованием цикла, условия и двух регекспов, можно было бы сделать одним лишь preg_replace.
— зачем Вы взяли в круглые скобки ( http: )? Вы ничего от этого не получили, лишь создали лишнюю группу.
Это ещё будет оптимизироваться, наверное... Но поскольку первоначально задача решалась через eregi, которая передаёт строки в массив, другого решения на тот момент я не нашёл.
Цитата:
— в Вашем случае нет никакого смысла вообще даже касаться ограничения жадности, так как это плохо влияет на производительность. Вместо .+? вполне достаточно было бы использовать +
Попробую.
Цитата:
— обрабатывать текстовый файл построчно, особенно выбранным Вами способом, не оптимально с точки зрения производительности.
А вот это - пофиг. Для той задачи, которая будет решаться этим скриптом, разница в производительности будет не критична.
Цитата:
Далее, неуниверсальность:
— по условию Вашей задачи может ли быть, что используемый протокол может быть не только http://, но и https:// или ftp:// и т.д.?
Не знаю... Наверное, может. Приму к сведению.
Цитата:
— по условию Вашей задачи может ли быть, что примечание в круглых скобках отделяется от URL не просто пробелом, а например двумя пробелами, или табуляцией, или даже переводом строки?
Только пробелом. Поскольку текст буду готовить я - это ограничение не критично.
В некотором роде, связка ссылка (сайт) - это некий аналог bbcode, только более удобный для ввода. Не думаю, что в bbcode можно позволять себе всякие вольности с синтаксисом.
Цитата:
— по условию Вашей задачи может ли быть, что примечание в круглых скобках займет несколько строк?
Этого не будет. Кроме того, это вообще некрасиво смотрится.

Цитата:
— по условию Вашей задачи может ли быть, что примечание в круглых скобках может содержать вложенные круглые скобки, или например символ "<", или даже подстроку "</a>", и т.д.?
Вряд ли. Но приму к сведению.
Цитата:
— по условию Вашей задачи могут ли допускаться ошибки например людей, которые составляют исходные тексты? Например, если забудут закрывающую скобку поставить, и т.д.?
Поскольку тексты буду составлять я - это маловероятно. Ну, и см. выше про bbcode.

Этот скрипт - частное решение для частной задачи. Работать с ним буду исключительно я (по крайней мере, планов по его распространению я не вынашиваю). Поэтому многие ограничения некритичны.
Цитата:
Надеюсь лишь донести мысль, есть ли вообще смысл заниматься подобной черной низкоуровневой работой.
Это интересно.


2989 сообщений
#15 лет назад
Вряд ли осваивание регулярных выражений можно назвать черновой работой.voron_76 чтобы у Вас не осталось неправильных ассоциаций: знак вопроса (?) не отключает в регулярных выражениях "жадность". Просто выражения содержащие знак вопроса обычно становятся "нежадными". Это важный нюанс.
6970 сообщений
#15 лет назад
Цитата ("elosoft"):Вряд ли осваивание регулярных выражений можно назвать черновой работой.
voron_76 чтобы у Вас не осталось неправильных ассоциаций: знак вопроса (?) не отключает в регулярных выражениях "жадность". Просто выражения содержащие знак вопроса обычно становятся "нежадными". Это важный нюанс.
Это инвертор, если я правильно понял. Да, об этом я читал.