Ако Х параметъра е празен

Ticketa

Registered
Опитам се да направя една проверка чрез preg_match.

При използването в момента ако имам стринг: {neshto:alabala}

preg_match('/^\{([a-z_-]+):(.*)\}$/', $segment, $matches)

Работи коректно, обаче искам да добавя още един параметър, който да не е задължителен. Представям си го по следния начин:

paramter:paramter:(text or null)
{neshto:alabala:portokala}
Резултат: okay

{neshto:alabala}
Резултат: okay

Тоест, preg_match да проверява дали има трети параметър и ако го има да го ползва, ако го няма просто да го игнорира. Мога да направя 2 preg_match, но имам бегли спомени, че чрез question mark ? може да се каже да се пропусне параметъра, ако е празен.

preg_match('/^\{([a-z_-]+):(.*)(?:(.*))\}$/', $segment, $matches)

Това е страшна глупост, което давам като пример и да, определено ще обърна внимание в изучаването на Regex. Все пак ако някой може да даде жокер :D

Код:
<?php
$urls = array(
    ' {neshto:alabala}',
    ' {neshto:alabala:portokala}',
);
foreach ($urls as $url) {
    
    preg_match( "/^\{([a-z_-]+):(.*)(:(.*))\?\}$/", $url, $m);
    print_r($m);
}
 
Близо беше :) Пробвай така:

Код:
preg_match('/^\s*{([a-z_-]+):(.*?)(?::(.*))?}$/', $segment, $matches)

  • виждам че в примерите имаш 2 спейса в началото, затова добавих и \s* преди всичко
  • (?: частта е за да работи въпросителният накрая без да прави ненужна група ":portokala"
  • .*? прави match-ването ungreedy/lazy

(Сигурно го знаеш, но според това дали искаш нещо да пише след : използвай .* или .+)
 
Ако имаш конкретна структура за нещо е по-лесно да си напишеш опростен парсер. По-лесно ще се чете и имаш повече контрол какво да се случва.
 

Горе