Не нравятся результаты поиска? Попробуйте другой поиск!
DLE FAQ » Все вопросы » Общие вопросы по PHP » Как сделать "умный" preg_replace?

Как сделать "умный" preg_replace?


     17.08.2022    Все вопросы » Общие вопросы по PHP    187

вопрос
Здравствуйте, Гостода...

Помогите соорудить preg_replace для выдирания разрешения из текста (переменной)...

Пример:

$video = "Xvid 576x320 29.97fps"
$video2 = "MPEG4 Video (H264) 1280x720 29.97fps 1998kbps"


Нужно выдрать разрешение (в данном примере это 576x320 и 1280x720)

То есть нужно забрать пробел (пробелы будут всегда), число (три-четыре цифры), английская буква x (икс), опять число (три-четыре цифры), опять пробел. Пробелы можно не убирать - потом отрежу.

Колличество пробелов в переменной может быть разное, как и разных чисел (цифр), но вот сочетание ПробелЧислоИксЧислоПробел будет в каждом случае

В итоге должно получаться следующее:

$resolution = "576x320"
$resolution2 = "1280x720"


Помогите пожалуйста...

Заранее благодарю!

Ответа пока нет


13 комментариев

dj-avtosh
PHP-developer

dj-avtosh - 18 августа 2022 10:53 -

(?P<width>\d+)\s?x\s?(?P<height>\d+)

ЯД: 41001679231462
Заказы в telegram (ремонт модулей, оптимизация нагрузок и т.п.): @blob42
В телегу писать сразу задачу и бюджет.

dj-avtosh
PHP-developer

dj-avtosh - 18 августа 2022 17:21 -

Более одного пбела внутри resolution (перед или после икса)

(?P<width>d+)s*?xs*?(?P<height>d+)


ЯД: 41001679231462
Заказы в telegram (ремонт модулей, оптимизация нагрузок и т.п.): @blob42
В телегу писать сразу задачу и бюджет.

dj-avtosh
PHP-developer

dj-avtosh - 18 августа 2022 17:31 -


https://onlinephp.io/c/e663b

<?php

$matches = [];
$returnValue = preg_match_all('/(?P<width>\d+)\s*?x\s*?(?P<height>\d+)/', 'MPEG4 Video (H264) 1280x720 29.97fps 1998kbps 1024x531', $matches);

if ( ! empty ($matches) )
{
	
	foreach($matches[0] as $mKey => $mValue)
	{
		
		${'resolution' . (0 != $mKey ? $mKey+1 : null)} = $mValue;
		
	}
	
}

foreach(get_defined_vars() as $variableKey => $variableRow)
{
	
	if (preg_match('~^resolution~', $variableKey))
	{
		
		echo '$' . $variableKey . ' = ' .  print_r($variableRow, 1) . PHP_EOL;
		
	}
	
}


ЯД: 41001679231462
Заказы в telegram (ремонт модулей, оптимизация нагрузок и т.п.): @blob42
В телегу писать сразу задачу и бюджет.

NONSENS
Юзер

NONSENS - 18 августа 2022 18:53 -

dj-avtosh, а зачем циклы "городить", если с этой задачей справится preg_replace?

Придумал как искомое найти:

$resolution = preg_replace('/\s[0-9]\d+x[0-9]\d+\s/', '', $video);
$resolution2 = preg_replace('/\s[0-9]\d+x[0-9]\d+\s/', '', $video2);

Находить то - находит, но правда именно искомое и удаляет... 4 часа гуглил - не нашёл
Раньше я похожую задачу решал, но за полгода всё из головы вылетело...

Нужно что-то типа: ОтНачалаСтроки минус (вычесть) Найденое (\s[0-9]\d+x[0-9]\d+\s) ДоКонцаСтроки
Или как-то "инвертировать", если это возможно с preg_replace...

Начало - конец строки нашёл, но вот никак не могу найти "вычитение" ("это пропускаем")...

В идеале ещё и пробелы отрезать, чтоб дополнительные операции не делать...

dj-avtosh
PHP-developer

dj-avtosh - 18 августа 2022 19:11 -

Вы просто не особо разбираетесь, цикл описан лишь для того, чтобы ваши переменные создавались автоматически. Ваша задача была выполнена мною точно по лекалу. То что делаете Вы не совпадает с Вашим "дано" от слова совсем. Я Вам показал тест регулярки. Вы можете распечатать $matches и получить вообще все, что Вам нужно.

Preg_replace тут вообще не к месту. Думаю мои слова подтвердят все местные эксперты.

ЯД: 41001679231462
Заказы в telegram (ремонт модулей, оптимизация нагрузок и т.п.): @blob42
В телегу писать сразу задачу и бюджет.

NONSENS
Юзер

NONSENS - 18 августа 2022 19:50 -

"Preg_replace тут вообще не к месту" - есть что-то проще для данной задачи?

Тут бы и str_replace стправился, если бы регулярки понимал...

TeraMoune
Эксперт

TeraMoune - 18 августа 2022 20:30 -

Каким образом str_replace должен справится ? Если он собрат другой функции с одноимённой приставкой replace. Который всё так же выполняет замену текста, но никак не поиск.

есть что-то проще для данной задачи?

Нету ничего проще preg_match, берите, что дано. Не устраивает, не берите или переделайте взяв за основу шаблон регулярки, попрактикуйтесь. А пример в любом случае будет полезен другим...

NONSENS
Юзер

NONSENS - 19 августа 2022 01:04 -

"Каким образом str_replace должен справится ?"

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

"Который всё так же выполняет замену текста, но никак не поиск."

Чтобы что-то заменить, это сначала нужно найти, так что при любой замене сначала идёт поиск.

preg_match_all выдаёт мне "Array" или колличество "найденого"
Да и к чему мне массив, если нужно забрать всего один "кусочек"

Пытался пихать "шаблон регулярки" в preg_replace - только ошибки получал. Потом стал сам "формулу сочинять"...

Выражусь проще (ибо мог перегрузить информацией в попытке наиболее понятно объяснить при старте темы): как отрезать (удалить, заменить пустотой) всё кроме самого разрешения?

К примеру в две операции preg_replace:
1. Удаляем всё до разрешения (до первого пробела не катит, т.к. разрешение не всегда в "нужном месте")
2. Удаляем всё после разрешения (тут проще - от пробела до конца строки)

dj-avtosh
PHP-developer

dj-avtosh - 19 августа 2022 11:07 -

Удалить все, кроме размеров (не тестил, да и тупо так делать)

echo preg_replace('~.*\s+(\d+\s*?x\s*?\d+)\s+.*~', '$1', 'MPEG4 Video (H264) 1280x720 29.97fps 1998kbps');

ЯД: 41001679231462
Заказы в telegram (ремонт модулей, оптимизация нагрузок и т.п.): @blob42
В телегу писать сразу задачу и бюджет.

NONSENS
Юзер

NONSENS - 19 августа 2022 13:52 -

Вот спасибо! Работает!

Я же говорил, что можно это сделать "просто", а в лубом деле чем проще - тем лучше.
Как я понял, если не затруднит объяснить начинающему, что "мы делаем": $1 - это мы возвращаем (заменяем) обратно то, что в скобки запихали - и этот приём можно использовать впредь?

В прошлый раз я как-то делал (не помню как, но очень хочу вспомнить, т.к. очень удобный инструмент): заменял пустотой, но регулярку прописал так (пол дня изучая статью про regex, которую гугл ни в какую по тому же запросу теперь находить не хочет), чтобы был "вычет" (то есть "это не заменять"). И вот хочу спросить: как это делается?

Ещё раз огромное спасибо!!!

dj-avtosh
PHP-developer

dj-avtosh - 19 августа 2022 14:06 -

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

ЯД: 41001679231462
Заказы в telegram (ремонт модулей, оптимизация нагрузок и т.п.): @blob42
В телегу писать сразу задачу и бюджет.

dj-avtosh
PHP-developer

dj-avtosh - 18 августа 2022 21:31 -

Вам нужно вычленить, а не заменить.

preg_match_all('/(?P<width>\d+)\s*?x\s*?(?P<height>\d+)/', 'MPEG4 Video (H264) 1280x720 29.97fps 1998kbps 1024x531', $matches);


в $matches[0] будет содержаться то, что вам нужно.

ЯД: 41001679231462
Заказы в telegram (ремонт модулей, оптимизация нагрузок и т.п.): @blob42
В телегу писать сразу задачу и бюджет.

TeraMoune
Эксперт

TeraMoune - 18 августа 2022 19:46 -

а зачем циклы "городить", если с этой задачей справится preg_replace?


А зачем человеку дан мозг ?, зачем люди пишут документации о писания функции ?. Чтобы такие как вы легко могли прочитать описание и понять, что делает функция. Вместо того, чтобы обратится к официальной документации и прочитать что такое preg_replace вы гуглите непонятно что и бегаете по всяким ресурсам. А надо бы просто открыть офф сайт.

Достаточно открыть первую ссылку по запросу php preg_replace и вы там сможете прочитать (preg_replace — Выполняет поиск и замену по регулярному выражению) ключевым является тут ЗАМЕНА

А то, что ищет и возвращает найденное выполняют другие функции
preg_match
и
preg_match_all

Чтобы комментировать - войдите или зарегистрируйтесь на сайте

Похожие вопросы

наверх