Conectarea automată sau regex în PHP

Am o matrice PHP ca aceasta (vine dintr-o bază de date MySQL, YouTube este doar un exemplu):

[regexpr] => array(4) (
   [0] => (string) http://*.youtube.com/v/*
   [1] => (string) https://*.youtube.com/v/*
   [2] => (string) http://youtu.be/*
   [3] => (string) http://m.youtube.com/watch*
)

Acum, ceea ce încerc să fac este să găsesc orice potrivite într-o adresă URL (în acest caz: verificarea dacă adresa URL este o adresă URL validă YouTube).

Ceea ce am încercat este următorul:

for($i = 0; $i < count($regexpr); $i++)
   $regexpr[$i] = preg_quote($regexpr[$i]);//because of the URLs

$expr = '/(('. implode('|', $regexpr) . '))/i';//Concatenating the ORs

$found = preg_match($expr, 'http://www.youtube.com/[foo]&v=MyVidID', $matches);

Cu toate acestea, din păcate, nu am reușit să concatenăm cu succes aceste expresii - nu primesc niciun succes "de succes".

Ar fi cineva să aibă un pointer despre cum să rezolve această problemă?

¡Gracias!

0
Da, pur și simplu conține expresiile scăpate pe care încerc să le concatenăm într-o singură expresie, astfel încât să nu trebuiască să introduc o preg_match ().
adăugat autor JD-Robbs, sursa
@webbandit: pentru() nu are paranteze, deci conține doar linia preg_quote.
adăugat autor Marc B, sursa
Introduceți $ expr în fiecare iterație pentru și obțineți mai bine preg_quote ($ regexpr [$ i]);
adăugat autor s.webbandit, sursa
Oh. Văd. preg_quote ($ regexpr [$ i]); în fiecare pentru iterație și $ expr .
adăugat autor s.webbandit, sursa
Afișați rezultatul var_dump ($ regexpr [$ i])); și var_dump ($ expr); pentru a fi mai informat despre problema dvs. Nu putem testa regexpii fără modele complete.
adăugat autor s.webbandit, sursa
Există o lungime maximă de tip pcre de puțin peste 65k octeți. L-am lovit odată ce făceam acest tip de lucruri.
adăugat autor goat, sursa

2 răspunsuri

dacă parsezi url-urile și apoi le compari cu o listă albă? Ceva asemănător cu:

$myurls= array('http://example.com', 'http://foo.com/', 'http://mysite.com/', 'http://youtube.com?feeble=2&blob=ixls');
$whitelist=array('foo.com', 'youtube.com');

foreach($myurls as $url){
    $parsed=parse_url($url);
    if(in_array($parsed['host'],$whitelist)) echo "$url OK";
}
0
adăugat
Da, acest lucru ar funcționa - vă mulțumesc foarte mult. Cu toate acestea, aceste componente de model regex există deja, așa că încerc să le reutilizez în loc să le redelam prin verificarea unei liste de albume a domeniilor. Multumesc! :-)
adăugat autor JD-Robbs, sursa
Aceasta este probabil cea mai bună idee. Doar furnizați o serie de nume de domenii și utilizați funcția parse_url a PHP
adăugat autor dockeryZ, sursa

Problema este sursa dvs. "regexs":

http://*.youtube.com/v/*
       ^---            ^---

asteriscurile sunt "zero sau mai mult de caracterul precedent", nu generale de tip wildcards. Deci, cauți ca caracterele / să devină opționale. Ceea ce doriți este probabil . , care este un "zero sau mai mult de orice caracter"

Cu toate acestea, le transmiteți prin intermediul preg_quote și că veți scăpa de metacaractele ORICE regex, astfel încât în ​​realitate nu treceți pe niciuna dintre aceste metode. Voi treceți în asterturi literale, perioade literale etc.

Trebuie să scăpați de regexurile dvs. și să renunțați la stadiul de pregătire, de ex.

http:\/\/.*\.youtube.com\/v\/.*
0
adăugat
Oh da, ai absolut dreptate - eu, de asemenea, am scapat de asteriscuri (nu sunt de folos!). Vă mulțumim că ați arătat asta. Sugestia ta a facut trucul - multumesc! Editare: Am rezolvat-o scăpând șirul și apoi inversând "manual" asteriscurile scoase. În acest fel funcționează în continuare automat.
adăugat autor JD-Robbs, sursa
PHP România, Moldova
PHP România, Moldova
173 participanți

Vorbim despre Yii, Laravel, Symphony, MySQL, PgSQL, WP, OpenCart... Pentru confort, opriți notificările. Parteneri: https://ciupacabra.com @js_ro @node_ro @python_ro @seo_ro @Romania_Bot Offtop: @holywars_ro Joburi: @php_job @Grupuri_IT