Страницы

Поиск по вопросам

Показаны сообщения с ярлыком url. Показать все сообщения
Показаны сообщения с ярлыком url. Показать все сообщения

понедельник, 13 апреля 2020 г.

ЧПУ на django

#python #url #django

                    
Поправьте если я не прав:
models.py:
...
def get_absolute_url(self):
    return '/pages/%s' % self.slug

urls.py:
url(r'^pages/(?P.*)/$', 'APP.views.view_page'),

APP.views.py:
def view_page(request, slug):
    page = get_object_or_404(Page, slug=slug)
    return render_to_response('TEMPLATE', {'x': page})

Не могу понять, как работает get-object-or_404, первый параметр это модель, а второй
slug  это поле в модели, принимает переменную из url.py:  и сверяет, если они
равны (читай: часть введеного УРЛа по регулярке совпадает с model.slug) грузит страницу,
а в противном случае 404. Так? А то ужасное описание здесь: get_object_or_404.
get_object_or_404(klass, *args, **kwargs)

Calls get() on a given model manager, but it raises Http404 instead of the model's
DoesNotExist exception.
Required arguments
klass
A Model, Manager or QuerySet instance from which to get the object.
**kwargs
Lookup parameters, which should be in the format accepted by get() and filter().
Example

The following example gets the object with the primary key of 1 from MyModel:
from django.shortcuts import get_object_or_404

def my_view(request):
    my_object = get_object_or_404(MyModel, pk=1)

This example is equivalent to:
from django.http import Http404

def my_view(request):
    try:
        my_object = MyModel.objects.get(pk=1)
    except MyModel.DoesNotExist:
        raise Http404

Note: As with get(), a MultipleObjectsReturned exception will be raised if more than
one object is found.
get_list_or_404
get_list_or_404(klass, *args, **kwargs)

Returns the result of filter() on a given model manager, raising Http404 if the resulting
list is empty.
Required arguments
klass
A Model, Manager or QuerySet instance from which to get the list.
**kwargs
Lookup parameters, which should be in the format accepted by get() and filter().
Example

The following example gets all published objects from MyModel:
from django.shortcuts import get_list_or_404

def my_view(request):
    my_objects = get_list_or_404(MyModel, published=True)

This example is equivalent to:
from django.http import Http404

def my_view(request):
    my_objects = list(MyModel.objects.filter(published=True))
    if not my_objects:
        raise Http404
Questions/Feedback

Having trouble? We'd like to help!
 Try the FAQ — it's got answers to many common questions. 
 Search for information in the archives of the django-users mailing list, or post
a question. 
 Ask a question in the #django IRC channel, or search the IRC logs to see if it has
been asked before. 
 If you notice errors with this documentation, please  open a ticket and let us know!
Please only use the ticket tracker for criticisms and improvements on the docs. For
tech support, use the resources above. 
Search

Version:

Contents
Django shortcut functions
render
Required arguments
Optional arguments
Example
render_to_response
Required arguments
Optional arguments
Example
redirect
Examples
get_object_or_404
Required arguments
Example
get_list_or_404
Required arguments
Example
Browse
Prev: File Uploads
Next: Generic views
Table of contents
General Index
Python Module Index
You are here:
Django dev documentation 
Using Django 
Handling HTTP requests 
Django shortcut functions
Download:

 Offline (development version): HTML | PDF | ePub 
Provided by Read the Docs.

© 2005-2012 Django Software Foundation unless otherwise noted. Django is a registered
trademark of the Django Software Foundation. Linux Web hosting graciously provided
by Media Temple. ](https://docs.djangoproject.com/en/dev/topics/http/shortcuts/#get-object-or-404)

Если я все реализовал ЧПУ как правильно и ошибок у меня нет, то прошу совета как
элегантно добавлять .html без / в конце урла, не прописывая .html в шаблоне.    


Ответы

Ответ 1



def get_absolute_url(self): return '/pages/%s.html' % self.slug url(r'^pages/(?P.*)\.html$', 'APP.views.view_page'),

воскресенье, 29 марта 2020 г.

Извлечение домена из ссылки и поиск ссылок по имени домена

#python #парсер #url #urllib


Задача стоит такая:


Сверка ссылок по домену(*) из TXT №2 с TXT №1
Сохранение уникальны ссылок в отдельный TXT №3
Добавление уникальных ссылок в TXT №1


При сверке по  доменам - идет сверка только доменов сайта без: http:// и без https://
, так же при сверке по домену не учитывается все что после доменной зоны (.com , .ru
, и т.п.)

Я разделил программу на подзадачи и написал код на python 3.8:
Подзадачи: 

Исходные данные:

1.txt

http://site.com/
https://sit1e.com/vwdsvdfw/vwdefei/userpanel?cid=2
https://site.com/index.php?id=1
http://sit2e.com/
http://site.com/vwifow/fwviiwf?

2.txt

http://site.com/
https://sit1e213.com/vwdsvdfw/vwdefei/userpanel?cid=2
https://site.com/index.php?id=1
http://sit222e.com/
http://site.com/vwifow/fwviiwf?


1) Достать домены:

import re

f1 = open('1.txt')
f2 = open('2.txt')

filevar1 = f1.read()
filevar2 = f2.read()

domains1 = re.findall(r'\/\/([\w\-]+)', filevar1) 
domains2 = re.findall(r'\/\/([\w\-]+)', filevar2)

#Вывод доменов с новой строки 

with open('domains1.txt','w') as out:
    for domen in domains1:
        print(domen,file=out)
with open('domains2.txt','w') as out:
    for domen in domains2:
        print(domen,file=out)

f1.close()
f2.close()

input('Нажмите Enter, чтобы выйти из программы')


Результат работы участка кода:

domains1.txt

site
sit1e
site
sit2e
site

domains2.txt

site
sit1e213
site
sit222e
site


2) Сравнить домены:

import re

def diff():
    with open('result1.txt') as text_one, \
            open('result2.txt') as text_two:
        return set(text_one) ^ set(text_two)
if __name__ == '__main__':
    with open('output.txt', 'w') as result:
        for i in diff():
            result.write(i)

input('Нажмите Enter, чтобы выйти')


Выходные данные:

output.txt

sit1e
sit2e
sit1e213
sit222e


3) Найти исходные строки по выделенным доменам в исходных файлах и записать их в
отдельный файл.
с этим возникают проблемы. Не знаю какую регулярную функцию использовать.

PS: пока искал ответ на свой вопрос, то заметил, что моя программа не учитывает субдомены,
вроде для этого уже существует специальная функция в python: urlparse, но я не могу
понять как ее использовать.

Можно ли как-то сократить код программы, чтобы не писать 3-й блок программы?
Можно-ли реализовать эту задачу проще?
    


Ответы

Ответ 1



Для чтения доменов из файлов со ссылками можно использовать следующую функцию: from urllib.parse import urlparse def get_domains(filename): with open(filename) as f: return ['.'.join(urlparse(line.strip()).netloc.split('.')[:-1]) for line in f] Проверка: dom1 = get_domains(r'C:\temp\1.txt') dom2 = get_domains(r'C:\temp\2.txt') print(dom1) # ['site', 'sit1e', 'site', 'sit2e', 'site'] print(dom2) # ['site', 'sit1e213', 'site', 'sit222e', 'site'] Работа со списками доменов как со множествами - объединение, пересечение, симметрическая разность: In [31]: set(dom1) | set(dom2) Out[31]: {'sit1e', 'sit1e213', 'sit222e', 'sit2e', 'site'} In [32]: set(dom1) & set(dom2) Out[32]: {'site'} In [33]: set(dom1) ^ set(dom2) Out[33]: {'sit1e', 'sit1e213', 'sit222e', 'sit2e'} Поиск ссылок по списку доменов: import re def search_domains(filename, doms): with open(filename) as f: text = f.read() pat = r'(https?://[^./\r\n]*?\b(?:{})\b[^\r\n]*)'.format('|'.join(doms)) return re.findall(pat, text) Проверка: In [47]: doms = set(dom1) ^ set(dom2) In [48]: doms Out[48]: {'sit1e', 'sit1e213', 'sit222e', 'sit2e'} In [49]: search_domains(r'C:\temp\1.txt', doms) Out[49]: ['https://sit1e.com/vwdsvdfw/vwdefei/userpanel?cid=2', 'http://sit2e.com/'] In [50]: search_domains(r'C:\temp\2.txt', doms) Out[50]: ['https://sit1e213.com/vwdsvdfw/vwdefei/userpanel?cid=2', 'http://sit222e.com/'] PS с записью результатов в файл я думаю вы справитесь сами.

четверг, 19 марта 2020 г.

Получение данных из URL после знака # (hash) на сервере

#url #ajax #php #сервер


Доброго времени суток Друзья! Продолжаю писать свою CMS систему, среди её "фишек"
будет функция перехода в режим "быстрой навигации".
Режим быстрой навигации, это по сути реализация системы клиент -><- сервер :

Клиент заходит на сайт, обработчик на сервере принимает запрос вида "?m:s;p:h;i:1;",
генерирует каркас(шаблон) и отдаёт.
Клиент получив каркас, отправляет новый запрос(Ajax) на сервер и заполняет принятыми
в ответ данными необходимые поля.

Слишком растянул вступление для вопроса, но хотелось бы по лучше объяснить, что же
я хочу узнать.
При переходе по следующей ссылке : mysite.ru/?m=s&p=h&i=1 сервер получит эти данные
через суперглобальный массив $_GET.
При переходе по следующей ссылке : mysite.ru/#m:s;p:h;i:1; серверу необходимо получить
данные после знака решётки(#).
Всё бы ничего, есть вариант использовать Javascript и с помощью браузера передать
эти данные на сервер, но есть одно "но", а если эту ссылку открыл не браузер, а например
поисковый робот?
И тут собственно возникает вопрос :
Как на сервере только средствами PHP получить данные из URL после знака решётки(#) ?
Использовать функцию parse_url() можно, но она позволяет обработать строку запроса,
а не получить её.
В интернете по этому поводу мало информации, а где то ещё и видел, что средствами
только PHP сделать этого нельзя.
Есть сервис от Яндекс, Яндекс.Музыка, там реализовано аналогичное.
Хочу дополнить свой вопрос :
А можно ли с помощью Javascript превращать текущий URL в URL вида "?m:h;......."
при этом не переходя на него, хотелось бы как то всётаки реализовать такую совместимость
и для поисковика, и для пользователя, который захочет взять ссылку себе на заметку.    


Ответы

Ответ 1



Судя по всему такое всё-таки невозможно. Понимаю, меня тоже такой ответ не устраивает, но был опыт поиска решения. Сервер просто не получает хэш. Так что только яваскриптом его отдельно отправлять. Для поисковых роботов и прочих безяваскриптовых существ должны быть адреса вида mysite.ru/m:s;p:h;i:1;, по которым доступна та же самая информация без аякса.

Ответ 2



Как на сервере только средствами PHP получить данные из URL после знака решётки(#) ? Никак, якоря являются свойством локальной HTML-страницы и не передаются PHP-скрипту в любом случае.

четверг, 13 февраля 2020 г.

Как вместо ссылки сделать активный текст?

#html #url #ссылки


Подскажите, пожалуйста, как составить программу или что нужно делать, чтобы вместо
длинной ссылки активным было одно слово. Например, вместо ссылки 
http://www.stroy-birzha.ru/request/?code=ffa8ce586819

Чтобы было слово 
Строй-Биржа.рф

Или вместо ссылки 
http://m.seaman-santehnika.ru/products/smesitel-seaman-eco-venice-ssn-1394p1/

Было активным слово смеситель с выдвижной лейкой? Спасибо всем, кто откликнется!    


Ответы

Ответ 1



Надо обернуть слово в тег (от англ. anchor, якорь): слово Например: Строй-Биржа.рф

понедельник, 10 февраля 2020 г.

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

#javascript #регулярные_выражения #url


Написал вот такой тест

// the domain is 'test.dev'
function test (str) {
    rep = str.replace(/^(?:https?:)?\/\/test\.dev(?:$|\/)/, "/");
    console.log('Was: ' + str + '\nNow: ' + rep);
}
test("http://test.dev/path?query=string");
test("https://test.dev/");
test("//test.dev");
test("//test.dev/?query=string");


, который работает и выдает

Was: http://test.dev/path?query=string
Now: /path?query=string

Was: https://test.dev/
Now: /

Was: //test.dev
Now: /

Was: //test.dev/?query=string
Now: /?query=string


Но ссылка может быть еще и такого вида (без слэша перед началом query string): //test.dev?query=string,
и тогда регулярка выше не срабатывает. Как бы в нее попроще этот вопросительный знак
воткнуть?  

Из //test.dev?query=string должно получиться /?query=string.

Придется дополнить вопрос. Исходные ссылки могут быть не только на test.dev, но и
на другие сайты (например, test.devil). Такие ссылки нельзя превратить в относительные,
точнее можно, но это не будет иметь смысла по отношению к сайту test.dev, поэтому они
должны оставаться как есть.
    


Ответы

Ответ 1



Предлагаю заменить rep = str.replace(/^(?:https?:)?\/\/test\.dev(?:$|\/)/, "/"); на rep = str.replace(/^(?:https?:)?\/\/test\.dev(?:$|\/|(\?))/, "/$1"); ^^^^ Добавив захватывающую подмаску (\?) в качестве ещё одной альтернативы в незахватывающую группу, можно отловить знак вопроса, а потом с помощью обратной ссылки $1 в шаблоне замены восстановить его в получаемой строке. function test (str) { rep = str.replace(/^(?:https?:)?\/\/test\.dev(?:$|\/|(\?))/, "/$1"); console.log('Was: ' + str + '\nNow: ' + rep); } test("http://test.dev/path?query=string"); test("https://test.dev/"); test("//test.dev"); test("//test.dev/?query=string"); test("//test.dev?query=string"); // /?query=string

Ответ 2



Достаточно просто добавить * после второй группы. Это будет означать, что после .dev должно быть ноль или больше слэшей, если образно. В итоге получается так: rep = str.replace(/^(?:https?:)?\/\/test\.dev(?:$|\/*)/, "/") P.S. ели еще не пользуетесь подобными вещами, советую посмотреть сервис regex101 - удобно и с наглядными пояснениями элементов

Ответ 3



Можно просто разделить строку по домену и взять правую часть. var domain = 'example.org'; [ 'http://example.org/some/path?key=value', 'https://example.org/some/path?key=value', 'http://example.org/?key=value', 'http://example.org?вполне_корректная_относительная_ссылка', 'http://example.org/', '//example.org/without/proto' ].forEach(function(url) { console.log(url.split(domain)[1]); }); // Так же можно проверить наличие корректного домена let list = [ 'http://example.organ/?key=value', 'http://example.com/', 'http://example.org/' ].map(url => { if (url.split('/')[2] !== domain) return url; return url.split(domain)[1] }); console.log(list);

пятница, 7 февраля 2020 г.

Для чего нужен код (хэштег) в конце сайта?

#html #url #веб_программирование


Последнее время заметил код (или хэштег) в адресной строке в конце многих сайтов. 
К примеру: https://site.ru/blablabla/#.V49UWuLLfK4

Причем при каждом обновлении страницы он меняется, а ссылка работает и без него.
Особенно этим грешит medium.com. Для чего это нужно и как это сделать? 

Только не пишите про якори. Это не они.
    


Ответы

Ответ 1



Эта часть URL называется "идентификатор фрагмента" (fragment identifier). Кусок URL, извлечь смысл из которого должен клиент, а не сервер. Поэтому, запрашивая документ по HTTP, клиент может эту часть в запросе даже не передавать (возможно, даже обязан не передавать, но надо глянуть в стандарт). Это семантически и высокоуровнево. Поначалу (и уже довольно давно) эта часть использовалась только для якорей в браузерах. Сервер возвращает весь документ, а клиент смотрит в фрагмент, ищет соответствующий якорь и проскролливает вид до него исключительно ради удобства пользователя. Это вы знаете. С распространением JavaScript к этой части появился доступ не только у браузера, но и у произвольного кода, присланного сервером. И эта часть стала неплохим местом для хранения небольшого кусочка клиентских данных, о которых серверу знать необязательно, а клиент как-то может отреагировать. Для чего? Ну, для всего, что умеет JavaScript, нужно только применить воображение. Сейчас это применяется для хранения состояния в небольших SPA прямо внутри ссылки. Это необязательно должен быть именно SPA, это может быть любое браузерное приложение на JS, возможно даже размещённое на нескольких страницах. Просто это короткий термин и понятно о чём. Ссылку клиент А может послать клиенту Б какими-то своими способами, и, открыв её, можно увидеть приложение точно в том же состоянии, в каком оно было у клиента А. Пример: Coriolis.io, инструмент для обмена сборками кораблей в Elite: Dangerous. Ещё вариация — хранение не всего состояния приложения, а только той части, которая может быть полезна другим пользователям. Например, роутинг. URL вида http://site.com/#/thing/42 Он осуществлялся в основном через фрагментную часть. Это пока не было HTML5 History API. Теперь есть. И теперь когда сервер можно научить понимать любые URL, можно писать SPA, меняющие "текущий URL" в пределах одной страницы без подобных костылей. AngularJS без "HTML5 mode" работает таким образом. Когда программируемой серверной части нет (или её лень настроить, что бывает), это единственный способ клиентского роутинга, который не ломает получающиеся ссылки: ведь фрагментную часть сервер игнорирует. Или обмен токенами. Некогда было засилье мессенджеров, работающих через WebRTC, и через фрагментный кусок образовывались комнаты. SPA ищет там токен комнаты, если не находит — генерирует случайный и добавляет его туда. Пользователю остаётся только скинуть ссылку. Перешедшие по ней попадут в SPA, а JS-клиент в нём увидит токен и сразу попросится в указанную комнату, попав к тому, кто ссылку скинул.

среда, 5 февраля 2020 г.

Можно-ли вместо доменного имени писать ip? И как?

#url #ip #домен #internet


Можно-ли, например вместо google.com или других имен писать 1.808.5789.908...(ip
ненастоящий) и др. ?

Если да, то как узнать ip адрес сайта ?

Если нет, то почему ?
    


Ответы

Ответ 1



Можно. Но не всегда. Отправляя http запрос на http://ip-address/uri на сервер приходит запрос с заголовком Host: ip-address. Если при этом http-сервер настроен на выдачу хоста «по умолчанию», вы получите данные с этого ресурса. Не стоит забывать, однако, что на одном сервере может обслуживаться множество виртуальных хостов. Все они слушают один интерфейс. К какому именно вы попадёте, сервер определяет по домену из заголовка Host. А как мне собственно узнать ip?(например, Гугла) Для этого существуют специальные протоколы DNS. И утилиты, работающие с этими протоколами(nslookup, drill и т.п.). Большие сайты, привязывают к домену сразу несколько IP адресов и резольвят их по технологии round-robin(с каждым запросом первым в списке будет другой IP). Некоторые также раздают разные пулы IP, в зависимости от местонахождения клиента. $ drill google.com ;; ->>HEADER<<- opcode: QUERY, rcode: NOERROR, id: 4719 ;; flags: qr rd ra ; QUERY: 1, ANSWER: 6, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: ;; google.com. IN A ;; ANSWER SECTION: google.com. 1 IN A 74.125.131.113 google.com. 1 IN A 74.125.131.102 google.com. 1 IN A 74.125.131.139 google.com. 1 IN A 74.125.131.100 google.com. 1 IN A 74.125.131.138 google.com. 1 IN A 74.125.131.101 ;; AUTHORITY SECTION: ;; ADDITIONAL SECTION: ;; Query time: 64 msec ;; SERVER: 8.8.4.4 ;; WHEN: Thu Jun 27 21:55:43 2019 ;; MSG SIZE rcvd: 124 1.808.5789.908 IP четвёртой версии - это 4 байта информации. Для удобства восприятия, распространён формат, в котором эти 4 байта представлены по отдельности с разделителем-точкой. Из-за этого, числа в составе IPv4 адреса никогда не бывают больше 255. Также, это не единственный способ представить IP адрес. Например, можно поразрядно сложить эти байты и пользоваться одним большим числом, например, для IP 74.125.131.102: >>> (((((74 << 8) + 125) << 8) + 131) << 8) + 102 1249739622 абсолютно валидной будет ссылка http://1249739622/

Ответ 2



Да, по идее можно: http://64.233.161.94 (ip настоящий - у меня сейчас в него ресолвится гугл). Но есть несколько нюансов, почему подобное может не рботать: сайт может сам проверять host и не реагировать на ip-адрес вместо имени на одном ip может существовать несколько сайтов, выбор между которыми происходит на основе host'а. В таком случае сервер либо выдаст ошибку, либо покажет страницу хостинга-владельца. при использовании защищённых протоколов (https) сертификат выдан на доменное имя, а не на ip-адрес, а значит браузер признает сертификат невалидным. Тут можно рассказать кучу всего про dns, но я обычно просто делаю в консоли ping: C:\>ping google.ru Pinging google.ru [64.233.161.94] with 32 bytes of data: Reply from 64.233.161.94: bytes=32 time=37ms TTL=48 Reply from 64.233.161.94: bytes=32 time=44ms TTL=48 Reply from 64.233.161.94: bytes=32 time=37ms TTL=48 Reply from 64.233.161.94: bytes=32 time=37ms TTL=48 Ping statistics for 64.233.161.94: Packets: Sent = 4, Received = 4, Lost = 0 (0% loss), Approximate round trip times in milli-seconds: Minimum = 37ms, Maximum = 44ms, Average = 38ms

Изменение url в адресной строке браузера

#url #ajax


Возник вопрос такого плана:
Имеется сайт "site.ru" необходимо по AJAX'у подгрузить страницу с пользователями,
которая располагается по адресу "site.ru/users/". Подгрузить то я подгрузила, только
встает другой вопрос: как сделать так, чтобы в адресной строке браузера тоже изменилось
url на "site.ru/users/", просто хочу весь сайт перевести на AJAX, но вот думаю, пользователям
не понравится, что они, к примеру не смогут дать своим друзьям ссылку на самих себя
ну или иную другую страницу. Вот сайты типа vk.com и odkl.ru они же тоже на AJAX'е
подгружают контент, иначе бы было невозможно слушать музыку и передвигаться по страницам,
и хочу заметить, что URL у них изменяется. Прошу гуру мне помочь.    


Ответы

Ответ 1



Чтобы без перезагрузки сменить адрес в браузере можно использовать History API, а именно pushState. Само собой, это будет работать только в браузерах, которые поддерживают HTML5. Простейший пример: var redirect = '/users/'; history.pushState('', '', redirect); За большим идите по ссылке и знакомьтесь с деталями.

Ответ 2



Я сейчас изучаю эту же тему и вот этот плагин jquery Address docs.

пятница, 24 января 2020 г.

HTTP запрос, с длиной ссылки примерно в 3тыс символов, выдает ошибку

#php #url


Использую на PHP функцию file_get_contents(). Когда длина url строки не большая,
то все работает. Но мне нужно делать запрос по API одного сайта, в котором парсятся
элементы из строки url . И когда пытаюсь сделать запрос с длиной ссылки примерно в
3тыс символов, мне выдается ошибка 

Warning: file_get_contents(''): failed to open stream: HTTP request failed! HTTP/1.1 403


Не пойму в чем проблема, и как её решить.

Ссылку в urlencode() обернул, и если ввести её в браузере, то запрос обрабатывается
нормально.
Может нужно что-то поменять в ini_set() или еще где?
    


Ответы

Ответ 1



Возможно проблема в следующем: в качестве метода отправки данных вы используете метод GET, используйте метод POST. С помощью GET лучше отправить небольшие тестовые данные. Максимальный объем здесь 4 Кб. Для POST такого явного ограничения нет. также в настройках самого сервере бывает, стоит ограничение на размер передаваемых файлов, нужно проверить этот параметр. сервер ожидает один метод передачи данных а вы используете другой

суббота, 11 января 2020 г.

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

#javascript #html #css #url


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


Ответы

Ответ 1



В HTML документе метод history.pushState() добавляет новое состояние в историю браузера Метод pushState() принимает 3 параметра: state, title (который в данный момент игнорируется), URL. Давайте рассмотрим каждый параметр подробнее: State — JavaScript объект, который связан с новой записью в истории браузера, созданной при помощи pushState(). Всякий раз, когда пользователь перемещается на новое состояние истории браузера при помощи таких функций, как, например history.back() или history.go(), срабатывает событие popstate, а в объект event передаётся свойство state. Title — в данный момент Firefox игнорирует данный параметр. Тем не менее аргумент может передаваться. Передача пустой строки вместо title должна быть безопасной с учётом будущих изменений метода. В качестве альтернативы можно передавать title в объекте state и использовать его оттуда. URL — URL новой записи в истории браузера передаётся в этом аргументе. Обратите внимание, что браузер не будет пытаться загрузить данный URL после вызова pushState(), но эту попытку можно сделать позднее, например, после перезапуска браузера. Новый URL не обязательно должен быть абсолютным. Если он относительный, тогда он образуется от текущего URL. var state = { 'page_id': 1, 'user_id': 5 }; var title = 'Hello World'; var url = 'hello-world.html'; history.pushState(state, title, url);

Найти параметр запроса в ссылке

#python #парсер #url


К примеру, для адреса:

url = 'https://example.com/path?key=value%20?:)#fragment?not-query'


Получить key:

key = 'value ?:)'

    


Ответы

Ответ 1



Параметр запроса можно получить, используя urllib.parse.parse_qs(): #!/usr/bin/env python3 from urllib.parse import urlparse, parse_qs url = 'https://example.com/path?key=value%20?:)#fragment?not-query' [key] = parse_qs(urlparse(url).query)['key'] print(key) # -> value ?:) Связанный вопрос: Retrieving parameters from a URL.

понедельник, 6 января 2020 г.

Динамическое изменение requirements для route-а. Symfony 3.3

#php #url #symfony2 #symfony #symfony3


Возможно ли динамически изменять параметр requirements для @Route ?

Что я имею ввиду:


В базе имеется список услуг, у который есть свой url (service1, service2 и т.д)
Имеется шаблон, который будет использоваться в данном случае.


Имею подобный Action:

/**
 * @Route(
 *     "/{service_url}/",
 *     requirements = {
 *         "service_url": "service1|service2|service3|service4"
 *     }
 * )
 */
public function blablaAction($service_url)
{
    ...code...
}


Могу ли я данный параметр изменять динамически? 

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


Ответы

Ответ 1



Естественно это возможно. Вернее так, я думаю это естественно возможно, но сам этого не делал. Давайте по порядку. В одном из ответов ссылались на Symfony CMF и их динамический роутер. Если открыть эту страницу документации вы увидите что там пишут в общем то о том, о чем я вам напишу ниже. Вот что пишут там https://symfony.com/doc/3.3/routing/routing_from_database.html Это не магия, это попросту кастомный лоадер. Это вообще говоря не проблема и никогда проблемой не было. Сейчас я Вам все объясню. Смотрите. Symfony - крайне гибкая система. По сути своей Symfony - это набор независимых компонентов. Вам нужно внимательнее изучить компонент Routing. Если внимательно прочитать документацию, то можно заметить что вы, например, можете создать свой, "кастомный", загрузчик роутов (обзову их по-русски именно так). И вот понимая что вы можете создать свой загрузчик, вы понимаете что можете загружать роуты из любого места и они у вас могут быть любой конфигурации. Будь то файл, будь то база данных, будь то что то пришедшее из космоса и естественно ваши роуты могут реагировать на состояние вашей системы, хоть температуру окружающей среды. Так же вам нужно понять что аннотации - это одно из описаний роутов которые подгружаются загрузчиком роутов... правильно! который загружает роуты описанные в аннотациях. Давайте теперь ближе к делу. Вам нужно сделать роуты, которые зависят от моделей. Нет ничего проще! Открываете документацию вот тут . Смотрите как создается кастомный Loader, создаете сервис с тэгом routing.loader и добавляете в описание своих роутов в (routing.yml). Все! В этот сервис вы можете добавить все что угодно и описывать роуты как угодно. Слева, справа, сверху и снизу! Не забудьте просто убрать существующие аннотации в контроллере и управляйте своими роутами в вашем собственном Loader-е Имеем в сухом остатке. Создаете свой лоадер согласно документации. (В его конструктор вы можете добавить EntityManager) Описываете роуты взависимости от ваших пожеланий (забирая данные из того же EntityManager) Добавляете его в routing.yml Радуетесь. Еще раз ссылка на документацию, она живет здесь https://symfony.com/doc/3.3/routing/custom_route_loader.html p.s. Последнее. согласно документации The routes defined using custom route loaders will be automatically cached by the framework. So whenever you change something in the loader class itself, don't forget to clear the cache. Это не должно сбивать вас с толку. Естественно что вся логика внутри сервиса остается динамической, но кэш надо будет чистить после изменений (я так понимаю что в dev режиме тоже)

Ответ 2



Такое возможно. Но только нужно что б@Route может состоять из имени урла (имя не изменяется) и его динамической части /services/{service_url}/. Как показано в примере по ссылке выше, правило будет выглядеть так: // src/AppBundle/Controller/ArticleController.php // ... class ArticleController extends Controller { /** * @Route( * "/articles/{_locale}/{year}/{slug}.{_format}", * defaults={"_format": "html"}, * requirements={ * "_locale": "en|fr", * "_format": "html|rss", * "year": "\d+" * } * ) */ public function showAction($_locale, $year, $slug) { } } В Вашем же случае должно быть как то так: /** * @Route( * "/services/{_service_url}/", * defaults={"_service_url": "sevice1"}, * requirements={ * "_service_url": "service1|service2|service3|service4" * } * ) */ public function blablaAction($_service_url){...} То есть необходимо наличие имени урла перед динамической частью.

Ответ 3



Динамически менять requirements не получится, так как этот параметр компилируется в кэш-файл и должен быть независим от внешних источников типа базы данных, так как скомпилируется единожды, затем будет использоваться скомпилированный файл. В проекте Symfony CMF решили немного исправить эту проблему и создали свой вариант роутера, который не кэшируется и всегда проверяет все условия в ран-тайме. Таким образом, они создали динамический роутер, который по данным из базы данных отдает нужную страницу. Подробнее про этот роутер можно прочитать здесь. Кроме того, если нужно просто отсеить все url-ы, которых нет в базе, то можно в самом контроллере запросить в БД нужный url и в случае, если он не найден, выдать ответ 404: /** * @Route( * "/{serviceUrl}/", * requirements = { * "serviceUrl": ".+" * } * ) */ public function blablaAction($serviceUrl) { $servicePage = $this->getRepository(ServicePage::class)->findBy(['url' => $serviceUrl]); if (!$servicePage) { return $this->createNotFoundException('Service url /' . $serviceUrl . ' was not found'); } ...code... }

Ответ 4



Вам это не нужно. Такой подход в корне неверен. Вам нужно воспользоваться банальным подходом (который был предложен выше, это /services/{serviceId}/) и проверять услугу внутри контроллера, там вы сможете сделать какие угодно проверки с услугами. В требованиях к идентификатору услуги можно оставить только regexp. Если вы попытаетесь реализовать выбранную вами схему, то вы пойдёте против системы и фреймворка, и обречёте себя, и следующих программистов, на постоянную боль от исправления багов в роутах и поддержку этого гиблого решения.

вторник, 31 декабря 2019 г.

Почему сайты не доступны по ip адресу?

#url #ip #dns #браузер #домен


Почему, если вбить в поисковую строку браузера ip-адрес сайта вместо url он будет
не доступен? Если я не ошибаюсь, браузер не откроет сайт по ip-адресу, даже если у
сайта ip выделенный.
    


Ответы

Ответ 1



Это зависит от настроек сервера и вида веб-сервера. Обычно, если специально ничего не делать, и сайт только один на сервере, то он будет открываться и по IP адресу. Несложно сделать так, чтобы для неизвестных доменов, и для запросов без заголовка Host, откры­вался ка­кой-то специально предназначенный сайт с одной страницей с объяснениями. Например, в случае nginx такой специальный сайт должен быть помечен параметром default_server. Если мы говорим о каком-то массовом виртуальном хостинге, то обычная практика делать имен­но так, то есть ограничивая доступ к серверу по IP. Никто не хочет выслушивать жалобы от недо­вольного клиента, сайт которого, по случаю оказавшийся первым в списке, откры­ва­ется при вво­де в адресную строку какого-то другого домена, который по любой причине ука­зывает на IP сервера. Владелец того другого домена тоже не будет рад такому развитию событий. Если ваш сайт работает по HTTPS, то одной настройки сервера будет недостаточно. Нужно будет получить SSL сертификат и для домена, и для IP адреса. Последнее не всегда возможно.

понедельник, 30 декабря 2019 г.

Удаление параметра из строки GET по регулярному выражению

#php #регулярные_выражения #url


Помогите с правильным составлением регулярного выражения  для preg_replace , точнее
мне нужно удалить из строки какой либо параметр GET

К примеру, строка cbook.php?idc=n&ids=n&p=2&q=44 из которой мне надо удалить параметр
p вне зависимости в какой позиции он стоит, возможно это ?p=2 или же &p=2. Для этого
использую такое регулярное выражение: {\?|\&(p=)[0-9]}

$s = preg_replace('/{\?|\&(p=)[0-9]}/', '','cbook.php?idc=n&ids=n&p=2&q=44'); 


Но нормальных результатов оно не дает, что я не правильно составил тут? (делал по
учебнику)
    


Ответы

Ответ 1



Бутор - эти регулярки, проще всего так $http = parse_url('/cbook.php?idc=n&ids=n&p=2&q=44'); parse_str($http['query'], $output); if(isset($output['p'])) { unset($output['p']); } $new = $http["path"] . '?' . http_build_query($output); echo $new; Пример https://repl.it/repls/KlutzyLargePike

Ответ 2



Без регулярных выражений: list($path, $query) = explode('?', 'cbook.php?idc=n&ids=n&p=2&q=44'); parse_str($query, $q); // $q - массив параметров unset($q['p']); $query = http_build_query($q); $url = "{$path}?$query"; echo $url; // cbook.php?idc=n&ids=n&q=44

Ответ 3



Для корректного удаления подстроки понадобится шаблон, состоящий из трёх альтернатив: Если удаляемый элемент находится сразу после вопросительного знака, но не является единственным GET-параметром (в этом случае надо оставить знак "?", и удалить знак "&" вместе с удаляемым элементом) Если удаляемый элемент находится сразу после вопросительного знака, и является единственным GET-параметром (в этом случае надо удалить знак "?", и все остальные символы после него) Если удаляемый элемент находится в любой другой позиции подстроки (в этом случае, вместе с удаляемыми символами надо удалять и знак "&", предшествующий удаляемой подстроке) Шаблон будет иметь следующий вид: '~(?<=\?)p=\d+&|&p=\d+|\?p=\d+$~' В комплекте с PHP-функцией он будет выглядеть таким образом: echo preg_replace('~(?<=\?)p=\d+&|&p=\d+|\?p=\d+$~', '', $str); Тестировался на следующих строках: cbook.php?idc=n&ids=n&crop=4&p=2&q=44 cbook.php?idc=n&ids=n&p=2&q=44 cbook.php?p=2&idc=n&ids=n cbook.php?idc=n&p=2 cbook.php?p=2 Посмотреть результаты

пятница, 27 декабря 2019 г.

Что обозначает символ собачки в URL адресе?

#url #php #javascript


Добрый день.
Интересует такой вопрос. Подгрузить данные аяксом, чтоб не перезапускать страницу
и быстрее работать, но при этом как-то сохранить это действие, чтобы потом к нему можно
было бы быстро вернуться. Зашёл на карты гугла, где есть url адрес, потом стоит знак
@, после чего идут координаты. URL меняется, но фактически вся страница при этом не
перезагружется, и в случае чего можно скопировать ссылку и вернуться к нужному месту.
Собственно вопрос: что обозначает символ url - @  и #? Как их присвоить строке и
как потом сосчитать?
Спасибо.    


Ответы

Ответ 1



Структура URL: Изначально локатор URL был разработан как система для максимально естественного указания на местонахождения ресурсов в сети. Локатор должен был быть легко расширяемым и использовать лишь ограниченный набор ASCII‐символов (к примеру, пробел никогда не применяется в URL). В связи с этим, возникла следующая традиционная форма записи URL: <схема>://<логин>:<пароль>@<хост>:<порт>/?<параметры>#<якорь> схема схема обращения к ресурсу; в большинстве случаев имеется в виду сетевой протокол логин имя пользователя, используемое для доступа к ресурсу пароль пароль указанного пользователя хост полностью прописанное доменное имя хоста в системе DNS или IP-адрес хоста в форме четырёх групп десятичных чисел, разделённых точками; числа — целые в интервале от 0 до 255. порт порт хоста для подключения URL-путь уточняющая информация о месте нахождения ресурса; зависит от протокола. параметры строка запроса с передаваемыми на сервер (методом GET) параметрами. Начинается с символа ?, разделитель параметров — знак &. Пример: ?параметр_1=значение_1&параметр_2=значение_2&параметр3=значение_3 якорь идентификатор с предшествующим символом #. Якорем может быть указан заголовок внутри документа или атрибут id элемента. По такой ссылке браузер откроет страницу и переместит окно к указанному элементу.

четверг, 26 декабря 2019 г.

Как получить url активной вкладки chrome?

#c_sharp #url #google_chrome #tab


В общем обошел весь stackoverfow. Никак не могу найти рабочий коd
    


Ответы

Ответ 1



Попробуйте это: // there are always multiple chrome processes, so we have to loop through all of them to find the // process with a Window Handle and an automation element of name "Address and search bar" Process[] procsChrome = Process.GetProcessesByName("chrome"); foreach (Process chrome in procsChrome) { // the chrome process must have a window if (chrome.MainWindowHandle == IntPtr.Zero) { continue; } // find the automation element AutomationElement elm = AutomationElement.FromHandle(chrome.MainWindowHandle); // manually walk through the tree, searching using TreeScope.Descendants is too slow (even if it's more reliable) AutomationElement elmUrlBar = null; try { // walking path found using inspect.exe (Windows SDK) for Chrome 31.0.1650.63 m (currently the latest stable) var elm1 = elm.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.NameProperty, "Google Chrome")); if (elm1 == null) { continue; } // not the right chrome.exe // here, you can optionally check if Incognito is enabled: //bool bIncognito = TreeWalker.RawViewWalker.GetFirstChild(TreeWalker.RawViewWalker.GetFirstChild(elm1)) != null; var elm2 = TreeWalker.RawViewWalker.GetLastChild(elm1); // I don't know a Condition for this for finding :( var elm3 = elm2.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.NameProperty, "")); var elm4 = elm3.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.ToolBar)); elmUrlBar = elm4.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Custom)); } catch { // Chrome has probably changed something, and above walking needs to be modified. :( // put an assertion here or something to make sure you don't miss it continue; } // make sure it's valid if (elmUrlBar == null) { // it's not.. continue; } // elmUrlBar is now the URL bar element. we have to make sure that it's out of keyboard focus if we want to get a valid URL if ((bool)elmUrlBar.GetCurrentPropertyValue(AutomationElement.HasKeyboardFocusProperty)) { continue; } // there might not be a valid pattern to use, so we have to make sure we have one AutomationPattern[] patterns = elmUrlBar.GetSupportedPatterns(); if (patterns.Length == 1) { string ret = ""; try { ret = ((ValuePattern)elmUrlBar.GetCurrentPattern(patterns[0])).Current.Value; } catch { } if (ret != "") { // must match a domain name (and possibly "https://" in front) if (Regex.IsMatch(ret, @"^(https:\/\/)?[a-zA-Z0-9\-\.]+(\.[a-zA-Z]{2,4}).*$")) { // prepend http:// to the url, because Chrome hides it if it's not SSL if (!ret.StartsWith("http")) { ret = "http://" + ret; } Console.WriteLine("Open Chrome URL found: '" + ret + "'"); } } continue; } }

суббота, 30 ноября 2019 г.

Как запустить мою программу при открытии ссылки в браузере?

#c_sharp #url


Есть программа, нужно сделать ссылку для неё, например, как у Steam: steam://open/friends.
Она должна открываться в браузере и запускать нужное мне окно; Подскажите, как это
делается, пожалуйста. 
    


Ответы

Ответ 1



Я буду объяснять на примере другой программы – sales logix (аббревиатура - slx), она регистрирует свой протокол slx:// например, ссылка может быть такой: slx://account/12345. Штука реально крутая: можно было по почте кинуть такую ссылку коллеге и у него по клику на линке открывалось приложение с окном по клиента ID=12345. Если вы хотите создать собственный протокол – то вам нужно две вещи сделать: зарегистрировать протокол в операционной системе и программу, которая его будет обрабатывать; прописать в программе обработку протокола. По этой ссылке вам предлагают вариант регистрации протокола через правку реестра (и так удобнее в корпоративном мире – раскатать reg-файл по нужным компам политиками Active Directory, чем руками ходить каждый настраивать), но если очень хочется без магии реестра и руками – то где-то в панели управления есть пункт типа "программы по умолчанию". Копирую пример reg-файла, на случай если линк протухнет: Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\slx] @="SalesLogix Protocol Handler" "URL Protocol"="" [HKEY_CLASSES_ROOT\slx\DefaultIcon] @="C:\\Program Files\\SalesLogix\\salesLogix.exe" [HKEY_CLASSES_ROOT\slx\shell] [HKEY_CLASSES_ROOT\slx\shell\open] [HKEY_CLASSES_ROOT\slx\shell\open\command] @="\"C:\\Program Files\\SalesLogix\\SalesLogixUrlLink.exe\" %1" Ну и нужно собственно в своей программе сделать поддержку этого протокола. Я думаю, что это абсолютно понятно, как сделать – в каждой программе есть метод Main: static void Main(string[] param) Вам нужно парсить переданные аргументы командной строки и, в соответствии с вашей логикой обрабатывать. Если на компьютере будет установлена программа и зарегистрирован протокол, то вызываться будет и с веб-страники, и из почты. Можно даже в ярлыки эту ссылку вписывать, как это делает стим – и тоже будет работать. Update. Передаваемая ссылка будет в args[0] целиком, парсить её нужно будет самостоятельно, отделяя протокол. Тест тривиальный: В c:\temp\proba01.exe: static void Main(string[] args) { var i = 0; foreach (var ar in args) { Console.WriteLine($"{i} = {ar}"); i++; } Console.ReadLine(); } Делаем обработчик: Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\s2x] @="SalesLogix Protocol Handler" "URL Protocol"="" [HKEY_CLASSES_ROOT\s2x\DefaultIcon] @="C:\\temp\\proba01.exe" [HKEY_CLASSES_ROOT\s2x\shell] [HKEY_CLASSES_ROOT\s2x\shell\open] [HKEY_CLASSES_ROOT\s2x\shell\open\command] @="\"C:\\temp\\proba01.exe\" %1" Демо-страница: test На выходе имеем:

суббота, 13 июля 2019 г.

URL роутинг на PHP

Начал разбираться в MVC PHP, после множества прочитанных статей и просмотренных видео уроков накатал каркас своего приложения. (Сразу попрошу не советовать использовать готовые решение, я хочу изобрести собственный велосипед, так мне легче во всем разобраться). Схема стандартная все запросы идут на index.php, в роутере разбираю URL на controller, action, params. Ну с этим проблем нет. URL получаются такого вида: http://localhost/categories/sport, где categories - имя контроллера, а sport - action. Потом создаю второй контроллер к примеру articles, URL - http://localhost/articles/football ну и все по прежней схеме. Вопрос: как создать ссылку вида http://localhost/categories/sport/articles/football, или http://localhost/categories/sport/football Только так чтобы не писать все в одном контроллере.
Вот класс роутера:
class Router {
protected $uri; protected $controller; protected $action; protected $params; protected $route; protected $method_prefix; protected $language;
public function getUri() { return $this->uri; }
public function getController() { return $this->controller; }
public function getAction() { return $this->action; }
public function getParams() { return $this->params; }
public function getRoute() { return $this->route; }
public function getMethodPrefix() { return $this->method_prefix; }
public function getLanguage() { return $this->language; }
public function __construct($uri) { $this->uri = urldecode(trim($uri, '/'));
// Get defaults $routes = Config::get('routes'); $this->route = Config::get('default_route'); $this->method_prefix = isset($routes[$this->route]) ? $routes[$this->route] : ''; $this->language = Config::get('default_language'); $this->controller = Config::get('default_controller'); $this->action = Config::get('default_action');
$uri_parts = explode('?', $this->uri);
// Get path like /lng/controller/action/param1/param2/ $path = mb_substr($uri_parts[0], 14);
$path_parts = explode('/', $path);
if(count($path_parts)) {
// Get route at first element if(in_array(strtolower(current($path_parts)), array_keys($routes))) { $this->route = strtolower(current($path_parts)); $this->method_prefix = isset($routes[$this->route]) ? $routes[$this->route] : ''; array_shift($path_parts);
} elseif(in_array(strtolower(current($path_parts)), Config::get('languages'))) { $this->language = strtolower(current($path_parts)); array_shift($path_parts); }
//Get controller - next element of array if(current($path_parts)) { $this->controller = strtolower(current($path_parts)); array_shift($path_parts); }
//Get action if(current($path_parts)) { $this->action = strtolower(current($path_parts)); array_shift($path_parts); }
//Get params - all the rest $this->params = $path_parts; } }
public static function redirect($location) { header("Location: $location"); exit(); }
public static function notFound() { header('HTTP/1.0 404 Not Found'); header('HTTP/1.1 404 Not Found'); header('Status: 404 Not Found');
return true;
} }


Ответ

Закрываю вопрос, после долгих поисков нашел, и решил использовать AltoRouter, рекомендую всем: http://altorouter.com/

пятница, 12 июля 2019 г.

Загрузка со скрытой прямой ссылкой

Мне нужно сделать скачивание файла на PHP, но так, чтобы пользователь не знал, где находится конечный файл. Файл платный. Пользователь его покупает и получает уникальную ссылку для его скачивания. Несколько вопросов. Где на сервере обычно хранят файлы, чтобы их не достать "случайно", так сказать. Как будет выглядеть ссылка (что там кодировать) Собственно как качать файл пользователю (если можно, пример PHP кода) Есть ли простой скрипт для изучения с таким функционалом? Ну или какой-нибудь класс PHP? Для себя... Что писать в Google, от чего плясать? Сам я просто не знаком с принципом работы такой штуки. Не знаю, с чего начинать и как делать. Заранее спасибо!


Ответ

1) положите .htaccess в папку (любую, где будут файлы) c записью : Deny all 2) отдавайте все файлы через некий скрипт php 3) пишите в базу какой-нибудь уникальный хеш для скачки (например md5(time().[id-файла])) 4) после того как отдали по хешу файл - удаляйте с базы данный хеш или делайте его [уже скачан]

Как сделать замену текста на ссылку с помощью JavaScript?

Есть текстовая строка вида var text = "somthing text and habrahabr.ru/login.php?vk=1 link " Ссылка взята от балды. Нужно любым способом сделать замену этой строки на ссылку. И не только такого вида. Что еще надо учесть: поддержка этих протоколов(т.е. преобразование в ссылку): http://, https://, ftp://, skype://, steam:// любые доменные имена (как, например, .рф) и поддержка поддоменов собственно поддержка кириллицы в имени домена Все это завернуть в функцию, к примеру. Уже написано и частично работает: function findAndReplaceLink(inputText) { var url = "http://test.com" var pattern = /([-a-zA-Z0-9@:%_\+.~#?&\/\/=]{2,256}\.[a-zA-Zа-яА-ЯёЁ]{2,4}\b(\/?[-a-zA-Z0-9а-яА-ЯёЁ@:%_\+.~#?&\/\/=]*)?)/gi; var replacedText = inputText.replace(pattern, '$1'); return replacedText; } На выходе должна быть строка: "somthing text and habrahabr.ru/login.php?vk=1 link " Помогите, пожалуйста, добить функционал. Заранее благодарен. UPDATE. нашел код с подобным функционалом (взял с vk.com), но не знаю, как изменить под свои нужды, под мою функцию. не поможете? message = (message || '').replace(/(^|[^A-Za-z0-9А-Яа-яёЁ\-\_])(https?:\/\/)?((?:[A-Za-z\$0-9А-Яа-яёЁ](?:[A-Za-z\$0-9\-\_А-Яа-яёЁ]*[A-Za-z\$0-9А-Яа-яёЁ])?\.){1,5}[A-Za-z\$рфуконлайнстРФУКОНЛАЙНСТ\-\d]{2,22}(?::\d{2,5})?)((?:\/(?:(?:\&|\!|,[_%]|[A-Za-z0-9А-Яа-яёЁ\-\_#%?+\/\$.~=;:]+|\[[A-Za-z0-9А-Яа-яёЁ\-\_#%?+\/\$.,~=;:]*\]|\([A-Za-z0-9А-Яа-яёЁ\-\_#%?+\/\$.,~=;:]*\))*(?:,[_%]|[A-Za-z0-9А-Яа-яёЁ\-\_#%?+\/\$.~=;:]*[A-Za-z0-9А-Яа-яёЁ\_#%?+\/\$~=]|\[[A-Za-z0-9А-Яа-яёЁ\-\_#%?+\/\$.,~=;:]*\]|\([A-Za-z0-9А-Яа-яёЁ\-\_#%?+\/\$.,~=;:]*\)))?)?)/ig, function () { // copied to notifier.js:3401 var matches = Array.prototype.slice.apply(arguments), prefix = matches[1] || '', protocol = matches[2] || 'http://', domain = matches[3] || '', url = domain + (matches[4] || ''), full = (matches[2] || '') + matches[3] + matches[4];
if (domain.indexOf('.') == -1 || domain.indexOf('..') != -1) return matches[0]; var topDomain = domain.split('.').pop(); if (topDomain.length > 6 || indexOf('info,name,aero,arpa,coop,museum,mobi,travel,xxx,asia,biz,com,net,org,gov,mil,edu,int,tel,ac,ad,ae,af,ag,ai,al,am,an,ao,aq,ar,as,at,au,aw,ax,az,ba,bb,bd,be,bf,bg,bh,bi,bj,bm,bn,bo,br,bs,bt,bv,bw,by,bz,ca,cc,cd,cf,cg,ch,ci,ck,cl,cm,cn,co,cr,cu,cv,cx,cy,cz,de,dj,dk,dm,do,dz,ec,ee,eg,eh,er,es,et,eu,fi,fj,fk,fm,fo,fr,ga,gd,ge,gf,gg,gh,gi,gl,gm,gn,gp,gq,gr,gs,gt,gu,gw,gy,hk,hm,hn,hr,ht,hu,id,ie,il,im,in,io,iq,ir,is,it,je,jm,jo,jp,ke,kg,kh,ki,km,kn,kp,kr,kw,ky,kz,la,lb,lc,li,lk,lr,ls,lt,lu,lv,ly,ma,mc,md,me,mg,mh,mk,ml,mm,mn,mo,mp,mq,mr,ms,mt,mu,mv,mw,mx,my,mz,na,nc,ne,nf,ng,ni,nl,no,np,nr,nu,nz,om,pa,pe,pf,pg,ph,pk,pl,pm,pn,pr,ps,pt,pw,py,qa,re,ro,ru,rs,rw,sa,sb,sc,sd,se,sg,sh,si,sj,sk,sl,sm,sn,so,sr,ss,st,su,sv,sx,sy,sz,tc,td,tf,tg,th,tj,tk,tl,tm,tn,to,tp,tr,tt,tv,tw,tz,ua,ug,uk,um,us,uy,uz,va,vc,ve,vg,vi,vn,vu,wf,ws,ye,yt,yu,za,zm,zw,рф,укр,сайт,онлайн,срб,cat,pro,local'.split(','), topDomain) == -1) { if (!/^[a-zA-Z]+$/.test(topDomain) || !matches[2]) { return matches[0]; } }
if (matches[0].indexOf('@') != -1) { return matches[0]; } try { full = decodeURIComponent(full); } catch (e){}
if (full.length > 55) { full = full.substr(0, 53) + '..'; } full = clean(full).replace(/&/g, '&');
if (!susp && domain.match(/^([a-zA-Z0-9\.\_\-]+\.)?(vkontakte\.ru|vk\.com|vkadre\.ru|vshtate\.ru|userapi\.com|vk\.me)$/)) { url = replaceEntities(url).replace(/([^a-zA-Z0-9#%;_\-.\/?&=\[\]])/g, encodeURIComponent); var tryUrl = url, hashPos = url.indexOf('#/'), mtch, oncl = ''; if (hashPos >= 0) { tryUrl = url.substr(hashPos + 1); } else { hashPos = url.indexOf('#!'); if (hashPos >= 0) { tryUrl = '/' + url.substr(hashPos + 2).replace(/^\//, ''); } } mtch = tryUrl.match(/^(?:https?:\/\/)?(?:vk\.com|vkontakte\.ru)?\/([a-zA-Z0-9\._]+)\??$/); if (mtch) { if (mtch[1].length < 32) { oncl = ' mention_id="' + mtch[1] + '" onclick="return mentionClick(this, event)" onmouseover="mentionOver(this)"'; } } return prefix + '/g, '>') + '" target="_blank"' + oncl + '>' + full + ''; } return prefix + '' + full + ''; });


Ответ

Таки разобрался. Вот код рабочей функции: http://pastebin.com/qSmfKRC2