Master-X
Форум | Новости | Статьи
Главная » Форум » Программинг, Скрипты, Софт, Сервисы » 
Тема: Простая регулярка нужна
цитата
24/03/16 в 01:04
 EagleOwl
Нужно с помощью PHP вытянуть из строки
http://site.com/category/name
подстроку name.
Вроде и просто совсем но чета я в них не разбираюсь. Спасибо.
цитата
24/03/16 в 02:02
 dimm
([^http://(.)*/(.)*/])*$

пробуй
цитата
24/03/16 в 02:05
 rx

<?php

$x="http://site.com/category/name";

preg_match("~^http://.*/(.*)$~smi",$x,$arr);

print_r($arr[1]);

?>
цитата
24/03/16 в 07:37
 rickdeckard
нафига регулярка?

array_pop(explode("/", $s))
цитата
24/03/16 в 08:03
 SAV

+1 когда можно обойтись без регулярки - лучше ее не использовать
цитата
24/03/16 в 10:48
 rx
есть такое

Код:

$x="http://site.com/category/name";
print(substr($x,(strrpos($x,"/")+1)));


хоть регулярка и простая - разница по таймингу гдето вдвое
цитата
24/03/16 в 10:51
 rx
rickdeckard писал:
нафига регулярка?

array_pop(explode("/", $s))


работает медленнее чем регулярка trollface.png
и гдето в три раза медленнее варианта с substr
цитата
25/03/16 в 02:55
 EagleOwl
Всем большое спасибо за помощь. Таки взял вариант без регулярки, больно он ловкий.
цитата
29/03/16 в 11:50
 rickdeckard
rx писал:
работает медленнее чем регулярка trollface.png
и гдето в три раза медленнее варианта с substr


и чо - может это разовый грабинг или вроде того - зачем преждевременные оптимизации? переписать на использование substr тогда
и вообще поставить php7 будет быстро работать
цитата
29/03/16 в 14:27
 rx
rickdeckard писал:
и чо - может это разовый грабинг или вроде того - зачем преждевременные оптимизации? переписать на использование substr тогда
и вообще поставить php7 будет быстро работать


"преждевременных" оптимизаций при выборе из одинаково трудоемкого не бывает,
относительные скорости от версии не зависят trollface.png
цитата
29/03/16 в 16:10
 Alexandur
С некоторой вероятностью после name может быть page. Так что лучше с начала считать.

Код:
explode('/', $x)[4];


rickdeckard:
При вызове этой функции с не массивом будет вызвана ошибка уровня E_WARNING.
цитата
30/03/16 в 13:11
 Ailk
такой варик не предлагали? trollface.png
Код:

$urlComopnents = parse_url($url, PHP_URL_PATH);
$categoryName = basename($urlComopnents, "/");
цитата
01/04/16 в 09:33
 rickdeckard
gimcnuk писал:
При вызове этой функции с не массивом будет вызвана ошибка уровня E_WARNING.

а зачем вы вызываете ее с не массивом? вызывайте с массивом тогда ошибки не будет.

Последний раз редактировалось: rickdeckard (01/04/16 в 09:37), всего редактировалось 1 раз
цитата
01/04/16 в 09:36
 rickdeckard
rx писал:
относительные скорости от версии не зависят



http://onlinephpfunctions.com/benchmarks
колонка String Manipulation
цитата
01/04/16 в 09:55
 Ailk
мне кажеца нада стремица к повышенной читабельности кода. Всякие эксплоды и субстринги этому не способствуют icon_cool.gif
цитата
01/04/16 в 17:23
 rx
rickdeckard писал:
http://onlinephpfunctions.com/benchmarks
колонка String Manipulation


https://ru.wikipedia.org/wiki/Относительность_(философия)

немножко помогу trollface.png

7.0.3

70000 Regexp done in 0.030171155929565 sec
70000 Substr done in 0.009404182434082 sec
70000 Arrayp done in 0.044059038162231 sec
70000 Parseu done in 0.065323829650879 sec

7.0.2

70000 Regexp done in 0.034229040145874 sec
70000 Substr done in 0.0086348056793213 sec
70000 Arrayp done in 0.048789024353027 sec
70000 Parseu done in 0.076931953430176 sec

7.0.1

70000 Regexp done in 0.032932996749878 sec
70000 Substr done in 0.0065271854400635 sec
70000 Arrayp done in 0.041872024536133 sec
70000 Parseu done in 0.06842303276062 sec

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

оставив сам тестовый код, по методике - из за нестабильности окружения в зависимости от запуска результаты могут отличаться вдвое, а среднего арифметического из 100 запусков - в коде бенчмарков нет (как и в примерах выше) trollface.png

пруф -

########################################
Start : 04/01/2016 07:44:31 am
Server : @[...]
PHP version : 7.0.3
Platform : Linux
########################################
Math : 0.543 sec.
String Manipulation : 0.695 sec.
Loops : 0.154 sec.
If/Else : 0.227 sec.
########################################
Total: : 1.618 sec.

когда по ссылке -
PHP version Math String Manipulation Loops If / Else Total Time
7.0.3 1.25385 1.21416 0.15628 0.22951 2.85381 sec.
цитата
01/04/16 в 19:51
 Ailk
это называется экономия на спичках smail101.gif

В процессе разработки и поддержки кода ты подавляющее большинство времени читаешь, а не пишешь. Поэтому стоит в первую очередь оптимизировать этот момент, конечно, если это не 1разовая работа написанная на коленке кому-то за бесплатно. Во вторую очередь надо бы посмотреть архитектуру приложения, бд, связи в бд. Настройка окружения и все такое. И если все еще не хватает. То подумать над масштабированием (вертикальным или горизонтальным). А не писать хуйню с субстрингами мотивируя это тем, что оно "быстрее" на N микросекунд smail101.gif

Сие просто точка зрения, никому ниче не навязываю.
цитата
01/04/16 в 20:32
 rx
Жизнь — цепь, а мелочи в ней — звенья. Нельзя звену не придавать значенья. trollface.png

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

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

разумеется сейчас почти все задачи можно решить путем грубого расширения или накидывания серверных мощностей. но - не все. и - не всегда это рентабельно, таки.
цитата
01/04/16 в 21:56
 Ailk
ну сколько ты добьешься своей субстринговой оптимизацией в приросте производительности обычного парсера, или даже движка для сайта\фреймворка? тысячные доли секунды?
rx писал:
* если в процессе разработки ты читаешь больше чем пишешь, то что-то идет не так.
Ну тут я аплодирую стоя. Писать без ошибок, чтоб не дебажить потом перечитывая свое творение несколько раз подряд это талант. Я к сожалению им не наделен. Да и запоминать спустя месяцы что написано в куске кода тоже не могу, увы. Снова приходится перечитывать.
цитата
01/04/16 в 22:48
 rx
ну оптимизация же не только на сабстринг. она везде. и в вычислениях/операциях, и в архитектуре, и складываясь на выходе - получается много. очень много. особенно в движке для сайта/фреймворке. как в используемой памяти, так и скорости исполнения.

что касается парсеров - не всегда сабстринг актуален, +1, но чем сложнее регэкспы/правила разбора и больше размер данных - тем больше разница во времени между простыми ф-циями и регулярками. да и регулярка регулярке рознь. НО - разумеется есть такое что в парсерах, особенно простых - скорость упирается скорее в ширину канала чем в CPU, причем сильно. А вот если канал широкий или многопоточное все и собирается с N точек, то вжевывать данные уже надо оптимально быстро и с минимальными затратами, не плодя сервера.

тут не столько талант (хотя медали/олимпиады/дипломы/етц имеются) сколько опыт - при повторении/наблюдении одного и того же N раз при одинаковом процессе мышления код рано или поздно универсализируется и читается легко, особенно при высоком уровне реюзинга. набивается с шишками icon_smile.gif
цитата
01/04/16 в 23:02
 Ailk
походу мне еще долго постигать дзен в программерстве smail101.gif
цитата
02/04/16 в 01:23
 Alexandur
rickdeckard писал:
а зачем вы вызываете ее с не массивом? вызывайте с массивом тогда ошибки не будет.

Просто в твоём примере вызывается функция и пхп выдаёт предупреждение. И тормозит.

Можешь сам сравнить:


error_reporting(0);

$start = microtime(true);

$x = 'http://site.com/category/name';

for($i=0; $i<10000000; $i++)
{
   //preg_match("~^http://.*/(.*)$~smi", $x, $arr);$result = $arr[1];   //3.353

   //$arr = explode("/", $x);$result = $arr[4];   //2.480
   //$result = explode('/', $x)[4];   //2.474
   
   //$result = array_pop(explode("/", $x));   //7.071
   //$arr = explode("/", $x);$result = array_pop($arr);   //2.977

   //$result = substr($x,(strrpos($x, "/")+1));   //1.200
   
   //$result = basename(parse_url($x, PHP_URL_PATH), '/');   //24.405
}



echo number_format(microtime(true)-$start, 3)';

цитата
02/04/16 в 07:50
 Ailk
тоже самое. пхп 5.4 без опкеша. Прогнал каждую 10+ раз:
Код:

<?php
error_reporting(0);

$start = microtime(true);

$x = 'http://site.com/category/name';

for($i=0; $i<1000000; $i++)
{
   //preg_match("~^http://.*/(.*)$~smi", $x, $arr);$result = $arr[1];   // 1.324

   //$arr = explode("/", $x);$result = $arr[4];   // 0.872
   //$result = explode('/', $x)[4];   //0.782
   
   //$result = array_pop(explode("/", $x));   // 1.764
   //$arr = explode("/", $x);$result = array_pop($arr);   // 1.065

   //$result = substr($x,(strrpos($x, "/")+1));   // 0.467
   
   //$result = basename(parse_url($x, PHP_URL_PATH), '/');   // 1.253  - из 10 раз ниразу до 1.3
   //$path = parse_url($x, PHP_URL_PATH); $result = basename($path, '/'); // 1.312 - из 10 раз ниразу меньше 1.3
   
}

echo number_format(microtime(true)-$start, 3);

(нолик с цикла убрал, чета у вас сервера мощные черезчур smail101.gif )


Эта страница в полной версии