Autor Zpráva
Sylar
Profil
Zdravím,
snažím se dát dohromady regulární výraz, který mi vytáhne jméno robota. Předpokládám, že jméno robota obsahuje část jako "bot", "net", "spider", "craw" apod. a regulárem se snažím ve stringu najít právě jeden z těchto podvýrazů a následně chci vytáhnout celé slovo, ve kterém se tento podvýraz vyskytl.

Dal jsem dohromady tohle, ale vyhodí mi to namísto "robot" pouze "c". Může mi někdo popostrčit, kde by mohla být chybka?
echo preg_replace("/.*([^ ]*[bot|craw|link|web|net|spider|http|www][^ ]*).*/", "$1", "abc robot abc"); // vytiskne "c", namísto chtěného "robot"
Chamurappi
Profil
Reaguji na Sylara:
Do hranatých závorek se píše výčet znaků, které můžou být na daném místě. Takže [bot|craw] trefí buď b, nebo o, nebo t, nebo svislítko, nebo c, nebo r, nebo a, nebo w.
Mimochodem, znáš nějakého robota, který by měl v názvu jen craw (= vole u ptáků) a ne crawl (= lézt)?
Sylar
Profil
Chamurappi:
jasně, už to vidím, výčet subvýrazů má být v kulatých závorkách, změnil jsem to tedy takto, ale stále mi to vyhodí pouze "bot" a mělo by to vyhodit celé slovo, ve kterém se ono "bot" vyskytuje, v našem případě tedy "robot".

$test = preg_replace("/.*([^ ]*)(bot|craw|link|web|net|spider|http|www)([^ ]*).*/", "$1$2$3", "abc robot abc");

Tvá poznámka je asi správná, ale v případě hledání podvýrazů myslím, že je určitě lepší hledat kratší (i když "špatný") výraz, než nenalézt schodu. Pro mne je důležité, že se žádný uživatel webu nehlásí jako *craw*, tudíž do filtru nespadne, naopak robot crawler ano.
DJ Miky
Profil
Je to kvůli hladovosti (greediness), která je standardně zapnutá. První .* tak požere všechno, co může (v příkladu tedy „abc ro“), a na následné ([^ ]*) již nezbyde nic. Je potřeba přepnout na líný buď celý výraz (modifikátor U) nebo první .* (přidáním otazníku: .*?). Např. takto:
$test = preg_replace("/^.*?([^ ]*(bot|craw|link|web|net|spider|http|www)[^ ]*).*$/", "$1", "abc robot abc");
Kromě otazníku jsem ještě doplnil kotvení na začátek (^) a konec ($) — v tomto případě nemají žádný efekt, ale přijde mi to čitelnější — a také jsem zjednodušil závorky.
Sylar
Profil
DJ Miky:
děkuji, to je ono.

Ještě jeden dotaz, je nějaká možnost, pokud ve stringu nic nenaleznu, aby mi to vyhodilo prádný řetězec? Nyní, když regex nic nenajde, vyhodí mi zpět celý původní string.

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: