Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

PHP Правильно распарсить строку ?

n0bleman Ученик (3), на голосовании 1 месяц назад
Надо вытащить insale из двух разных вид строк как сделать это правильно без такого кода по нормальному если строка содержить адрес profile или id в соответсвие с этим выполнить код
$url= 'world/id/insael/';
$findme = 'world/profile/insael/"
$pos = strpos($url, $findme);

if ($pos === false) {
echo "Строка не найдена";
}
else
{
$url = explode("world/id/",$url);
echo "Строка найдена разделяем и выводи то что идет после world/id/";

echo "Привет " . $url[1];
//Выводит ПРивет insael/
}
Голосование за лучший ответ
AlexKurov Мыслитель (9049) 2 месяца назад
 $url1 = 'world/id/insael/'; 
$url2 = 'world/profile/insael/';

// Определяем шаблон для извлечения "insael"
$pattern = '#world/(id|profile)/([^/]+)/#';

if (preg_match($pattern, $url1, $matches)) {
// $matches[2] содержит то, что мы ищем
echo "Привет " . $matches[2];
} elseif (preg_match($pattern, $url2, $matches)) {
echo "Привет " . $matches[2];
} else {
echo "Строка не соответствует шаблону";
}
Объяснение:
Шаблон регулярного выражения:

# — это разделитель регулярного выражения.
world/ — ищем строку, начинающуюся с world/.
(id|profile) — либо id, либо profile.
/([^/]+)/ — захватываем всё, что идёт после id/ или profile/, до следующего /.
preg_match:

Функция ищет совпадение строки с шаблоном.
Если совпадение найдено, то результат захватывается в массив $matches, где:
$matches[0] — это полное совпадение.
$matches[1] — это id или profile.
$matches[2] — это insael.
Проверка нескольких строк:

Вы можете использовать одно и то же регулярное выражение для любых строк с нужной структурой.
Этот подход легко расширить, если появятся дополнительные паттерны, и он более устойчив, чем разбиение строк вручную.
Анонимус Просветленный (29122) 2 месяца назад
 <?php 

function extractInsale($url) {
// Регулярное выражение для поиска "insael" после "world/id/" или "world/profile/"
// \b - граница слова, чтобы избежать совпадений внутри других слов
// (?:...) - неговорящая группа (не создает отдельный захват)
// .+? - один или более символов (жадный), но как можно меньше
if (preg_match('/\b(?:world\/id\/|world\/profile\/)(.+?insael)\b/i', $url, $matches)) {
// $matches[1] содержит "insael" или часть строки перед insael
return $matches[1];
} else {
return null; // Или выбросить исключение, если insael не найден
}
}


$urls = [
'world/id/insael/',
'world/profile/insael/',
'other/world/id/insael/', // тест на частичное совпадение
'world/id/something/insael/', // тест на более длинную строку
'world/profile/something_else/insael', // тест на более длинную строку
'no_match',
];

foreach ($urls as $url) {
$result = extractInsale($url);
if ($result !== null) {
echo "URL: " . $url . ", Insale: " . $result . "\n";
} else {
echo "URL: " . $url . ", Insale NOT FOUND\n";
}
}

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