Založení a design webu a eshopu taneční školy
Zobrazují se odpovědi 1 až 5 z 5

Regex: Vytáhnutí parametrů

  1. Zdravím,
    Dostávám fragment HTML kódu, ze kterého mám vycucat dva až tři atributy ze jedné značky.
    Hodnoty atributů mohou být ve dvojitých nebo jednoduchých uvozovkách (začínat a končit musí stejnou).
    Atributy mohou být napsány velkými nebo malými písmeny a v libovolném pořadí. A mezi nimi mohou být na libovolném místě jiné atributy.
    Příklad (chci dostat dvojici nebo trojici atributů name:property:content z každé <meta>):
    Kód:
    <meta name="referrer" content="unsafe-url"/> 
    <meta content="WebTrh, byznys, podnikání" name="keywords" />
    <meta data-something="1" name="news_keywords" content="web,trh"> 
    <META value='@WashingtonPost' data-something="1" name="twitter:site"/> 
    <meta name='twitter:card' content="summary_large_image" data-something="1"> 
    <title>Washington Post</title>
    <meta data-something1="1" content='type1' data-something2="2" property="og:type" />
    Nemohu použít knihovny typu SimpleXML, DOMDocument, protože html nedostávám celé (a validní).
    Atributy vycucnout umím, ale jen pro jedno pořadí atributů a jedno použití "/'.
    Znáte elegantnější přístup?
    Díky.

  2. Co se právě děje na Webtrhu?
  3. PHP kód:
    <?php
    function getMetaFromHTML($html){
        
    $finalMetas = [];
        
    preg_match_all('~<meta\s*([^>]+)\s*\*>~i'$html$metasPREG_SET_ORDER);
        foreach(
    $metas as $meta){
            
    preg_match_all('~([a-z0-9:_\-]+)=(?:"([^"]*?)"|\'([^\']*?)\')~i'$meta[1], $attributesPREG_SET_ORDER);
            
    $currentMeta = [];
            foreach(
    $attributes as $attribute){
                
    $currentMeta[$attribute[1]] = $attribute[2]?:$attribute[3];
            }
            
    $finalMetas[] = $currentMeta;
        }
        return 
    $finalMetas;
    }

    var_dump(getMetaFromHTML('
    <meta name="referrer" content="unsafe-url"/> 
    <meta content="WebTrh, byznys, podnikání" name="keywords" />
    <meta data-something="1" name="news_keywords" content="web,trh"> 
    <META value=\'@WashingtonPost\' data-something="1" name="twitter:site"/> 
    <meta name=\'twitter:card\' content="summary_large_image" data-something="1"> 
    <title>Washington Post</title>
    <meta data-something1="1" content=\'type1\' data-something2="2" property="og:type" />
    '
    ));


    /*
    array(6) {
      [0]=>
      array(2) {
        ["name"]=>
        string(8) "referrer"
        ["content"]=>
        string(10) "unsafe-url"
      }
      [1]=>
      array(2) {
        ["content"]=>
        string(27) "WebTrh, byznys, podnikání"
        ["name"]=>
        string(8) "keywords"
      }
      [2]=>
      array(3) {
        ["data-something"]=>
        string(1) "1"
        ["name"]=>
        string(13) "news_keywords"
        ["content"]=>
        string(7) "web,trh"
      }
      [3]=>
      array(3) {
        ["value"]=>
        string(15) "@WashingtonPost"
        ["data-something"]=>
        string(1) "1"
        ["name"]=>
        string(12) "twitter:site"
      }
      [4]=>
      array(3) {
        ["name"]=>
        string(12) "twitter:card"
        ["content"]=>
        string(19) "summary_large_image"
        ["data-something"]=>
        string(1) "1"
      }
      [5]=>
      array(4) {
        ["data-something1"]=>
        string(1) "1"
        ["content"]=>
        string(5) "type1"
        ["data-something2"]=>
        string(1) "2"
        ["property"]=>
        string(7) "og:type"
      }
    }*/
    Naposledy upravil Aleš Jiříček : 21.05.2020 v 01:35

  4. Díky. Zkusil jsem a vrací mi to
    Kód:
    array(0) {
    }
    . Hned první preg_match_all() vyloví prázdné pole.

    Nemá místo "*\*" ke konci 1. regexu být "*/*"? A nebo to vynechat úplně, protože "\s" to pojme stejně?

    A ještě bych jako modifikátor přidal "s (PCRE_DOTALL)" a možná i "u (PCRE_UTF8)".

  5. podle mě hned v tom prvním preg_match_all je chyba, zkus z jeho konce odstranit to \*, podle mě tam být nemá.

    Správně by to ale mělo ošetřovat i znak >, který bude uvnitř hodnoty atributu, ještě nad tím nějaká práce bude potřeba

  6. v tom prvnim regexu ma byt /* ne \* to je rpeklik a byt tam ma, prtooze tag muze koncit /> a to \s* fakt nepojme

    na > v atributu jsem zapomnel :) nicmene ted nemam cas and tim vic dumat - zas takovy mag v regexech nejsem abych to vysvihl z hlavy, bude to doecla challenge, nebo me nejaky regex mag vyvede z omylu a bdue to jednoduche, kdo vi..

Spolupracujeme: Jooble.org, Aximum - profesionální překlady Hostujeme u Server powered by TELE3