Autor Zpráva
jirka2
Profil
Ahoj,
mám string, kde jsou URL oddělené čárkou. Jednotlivé URL dostávám pomocí následujícího PHP příkazu:
preg_match_all('/https?:\/\/[^, ]+/', $string, $match)
To spolehlivě fungovalo do té doby, než se v URL objevila čárka. Otázka zní, jak rozparsovat string na URL, které mohou obsahovat i čárku. Například:
$string = "https://en.wikipedia.org/wiki/The_Good,_the_Bad_and_the_Ugly,https://cs.wikipedia.org/wiki/Hodn%C3%BD,_zl%C3%BD_a_o%C5%A1kliv%C3%BD";
Děkuji za inspiraci či rady.


Zkoušel jsem i ChatGPT, ale v tomto případě mi umělá inteligence moc nepomohla.
RastyAmateur
Profil
Pokud víš, že každá ta URL adresa začíná na "http(s)://", můžeš to podle toho splitovat. Něco jako:
$string = "https://en.wikipedia.org/wiki/The_Good,_the_Bad_and_the_Ugly,https://cs.wikipedia.org/wiki/Hodn%C3%BD,_zl%C3%BD_a_o%C5%A1kliv%C3%BD";

$keywords = preg_split("/[,\s]*https?:\/\//", $string);
print_r($keywords);

Array
(
    [0] => 
    [1] => en.wikipedia.org/wiki/The_Good,_the_Bad_and_the_Ugly
    [2] => cs.wikipedia.org/wiki/Hodn%C3%BD,_zl%C3%BD_a_o%C5%A1kliv%C3%BD
)

Případně obdobně můžeš upravit regex tak, aby se nezastavil u první čárky, ale u prvního ,http(s)://.

Nebo celkově splitovat podle http(s):// a to odříznutí čárky (a whitespace) vyřešit až v postprocessingu.

A nebo se zamyslet, kde se ti bere $string v tak nepříjemném formátu a zamyslet se, jestli to nejde udělat trochu jinak, aby to následné zpracování bylo přívětivější.

Těch možností je více, záleží jen na tom, jak moc to chceš mít robustní. Aby sis za týden neuvědomil, že vlastně i na tohle řešení se ti objeví nějaký případ, na kterém to neprojde.
Keeehi
Profil
Tento regex zvládne to co chceš na tomto ukázkovém případě. Může to ale selhat na nějakém jiném, tak si to pořádně otestuj. Ale rozhodně, jak píše RastyAmateur, pokud můžeš ovlivnit vstup, tak by bylo mnohem lepší udělat to tam.
https?:\/\/.+?(?=(?:,https?:\/\/|$))
jirka2
Profil
Máte pravdu oba, ten vstupní soubor je taková všehochuť. Nejprve jsem jej projel a opravil některé zbytečné komplikovanosti. To je nejlepší řešení. Ale zase jsem se něčemu přiučil a za to vám oběma děkuji.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0