Есть регулярка: https://regex101.com/r/mqolQp/2 в коде есть: Код (CSS): url('../fonts/MagistralBlack.ttf') url(../img/button__shadow.png) нужно с помощью preg_match_all() вытащить то, что в скобках, но без учета кавычек, т.е. там могут быть и одинарные, и двойные, и вообще их может не быть. Т.е. на выходе должно получиться: Код (Text): Array ( [0] => ../fonts/MagistralBlack.eot? [1] => ../fonts/MagistralBlack.woff [2] => ../fonts/MagistralBlack.ttf [3] => ../img/button__shadow.png ) т.е. я не могу сообразить, как дописать условие убирающее кавычки, если таковые есть.
Большое спасибо!!! Вот если кому будет нужно: https://regex101.com/r/mqolQp/3 --- Добавлено --- да, но тут нужно получить сразу получить массив, и для trim нужно сразу 2 обертки т.е. для двух типов кавычек
@AlexandrS просто направление логики не правильная была. Вот держи: http://sandbox.onlinephpfunctions.com/code/4ceb1e159879d447320b84578d701dde3e380586 --- Добавлено --- теперь картина ясна --- Добавлено --- Кода больше будет
@AlexandrS решил вечерком на пол часика, от безделья вернуться сюда. Вот вся сущность: PHP: <?php $string = <<<'EOT' @font-face { font-family: 'MagistralBlack'; src: url('../fonts/MagistralBlack.eot?') format("eot"), url("../fonts/MagistralBlack.woff") format('woff'), url('../fonts/MagistralBlack.ttf') format('truetype'); font-weight: 700; font-style: normal; background: #fe2b58 url(../img/button__shadow.png) center no-repeat; } font-style: normal; <a href="/docs.php">Documentation</a> EOT; function crazy_reg ( array $arr, callable $call, string $str ) { [ $first, $last ] = $arr; $cf = strlen ( $first ); # $cl = strlen ( $last ); $c = substr_count ( $str, $first ); # $len = 0; while ( $c-- ) { $str = substr ( $str, ( strpos ( $str, $first ) + $cf ) ); $return[] = $call ( substr ( $str, 0, strpos ( $str, $last ) ) ); } return $return; } print_r ( crazy_reg ( [ 'url(', ')' ], function ( string $a ) { return $a; #strtr ( $a, [ '"' => '', "'" => '' ] ); }, strtr ( $string, [ '"' => '', "'" => '' ] ) ) ); callable можно удалить, оставил как памятник перед следующей правкой.
Регулярка: <p>complecte: 0.0010001659393311</p><p>memory: 1.7 KB</p> Не регулярка: <p>complecte: 0.00099992752075195</p><p>memory: 112 Bytes</p> PHP: $UNIX_1 = microtime ( 1 ); $MEMORY_SET = memory_get_usage (); preg_match_all ( '/url\((?:[\'"]?)(.*?)(?:[\'"]?)\)/', $string, $a ); print_r ($a[1]); $MEMORY_GET = memory_get_usage(); echo '<p>complecte: ' . ( microtime ( 1 ) - $UNIX_1 ) . '</p>'; echo '<p>memory: ' . bytes ( $MEMORY_GET - $MEMORY_SET ) . '</p>'; --- Добавлено --- я вот не помню, @nospiou ты вроде со мной бодался на тему регулярок
А объясните по этому отрывку: Код (Text): (?:['"]?) ['"]? - это как бы дает понять что данные символы не обязательно могут быть. а вот это часть ?: что она означает?
http://qaru.site/questions/1652968/regular-expression-with-if-condition Если --- Добавлено --- нет ?: --- ['"] --- ? Если истина найдена из --- набор символов [ определенных ] --- Квантификатор знак вопроса означает 0 или одно повторение. То есть либо одно повторение, либо ни одного. --- Добавлено --- тоже самое что PHP: if ( in_array ( $a, [ '"', "'" ] ) ) { ... }
1) если уж измеряешь, то делай это одинаково. а то в одном случае ты результат сохраняешь в $a, а в другом сразу в print_r(). тогда сразу и разница будет не столь большой, хотя конечно и сохранится. 2) памяти у регулярок показывает больше, просто потому, что в итоговой $a, хранится не только искомый массив, но и в $a[0] массив полных вхождений. сделай $a[0]=null; и увидишь как разница, ещё уменьшится 3) насчет скорости, у меня,локально, вообще complecte: 0 показывает, в обоих случаях(у тебя разница тоже, на уровне погрешности измерений). это говорит о том что разница в скорости настолько мала, что об этом даже нет смысла говорить. по сути, это доказывает что регулярки очень быстрые. почти тоже самое что и ламповый ручной парсинг. и вообще, если уж мерить скорость, то нужно измерять не однократный вызов, а многократный. 4) хорошо. написал ты своего монстра. а как насчет поддержки этого кода, или расширения? несомненно это возможно, но затраты времени и сил несопоставимы. разобраться что там у тебя происходит, нужно время и какой-никакой опыт. ты сам через полгода вернёшься к коду, и будешь полчаса втыкать что там и как) а это по сути элементарная парсинг. а что будет там когда задача усложнится? тупо - добавить регистронезависимость, или поддержку юникода... в регулярке, добавить флаги и минимальные исправления регулярки.. профит. а у тебя? правки почти в каждой строке, баги и тесты тесты тесты.... ну его нафиг. в 2019 то году
(?: ) - Не сохранающие в "карман" скобки. Подробнее... В данном случае можно и без этой части обойтись, так как квантификатор сразу за ['"] размещается.