Explode con multiples delimitadores por los que cortar la cadena

Por ejemplo si queremos sacar los elementos de una lista de un html:

$trozos = preg_split( "/(<li>|<\/li>)/", html_entity_decode($html));

Tips&Tricks de Drupal 8

Ultimamente me estoy peleando más con Drupal 8 asi que aqui dejo una chuletero rapido:

Obtener el detalle de un nodo a partir de su id:

$node = \Drupal::entityManager()->getStorage('node')->load($id);

En caso de querer recuperar el nodo actual:

$node = \Drupal::request()->attributes->get('node');

Y a partir de ese nodo, obtener los datos:

$nid = $node->id();
$tipo = $node->getType();
$titulo = $node->getTitle();
$campo =  $node->get('field_campo')->getValue()[0]['value'];
$imagen = $node->field_imagen->entity->getFileUri();

// obtenerlos en un idioma especifico 
$titulo_ingles = $node->getTranslation('en')->getTitle();

Obtener el nombre de una taxonomía a partir de su id:

$term = \Drupal\taxonomy\Entity\Term::load($id);
$taxonomia = $term->getName();

Obtener el idioma actual:

$idioma = \Drupal::languageManager()->getCurrentLanguage()->getId();

Acceder a la configuración del site, como por ejemplo para sacar el nombre de este (util si estas desarrollando un Drupal en multisite):

$site_config = \Drupal::config('system.site');
$site_name = $site_config->get('name');

Realizar una consulta a pelo en la base de datos:

// sacando varios resultados
$result = db_query('SELECT name
                    FROM s_taxonomy_term_field_data 
                    where langcode = :idioma', array(':idioma'=>'es'))->fetchAll();

// sacando un unico resultado
$imagen = db_query('SELECT uri FROM s_file_managed where fid = :id', array(':id'=>$id))->fetchField();

Guardar un registro en el log (tabla watchdog de la base de datos)

// el valor 'clave_referencia_log' nos sirve para identificar el mensaje en la tabla 
\Drupal::logger('clave_referencia_log')
    ->info("Mensaje guardado en el log, llamada desde la función" . __FUNCTION__ );

Zipear un directorio entero con recursividad

La llevo usando ya hace tiempo y ni me acuerdo de donde la saque, pero funciona de mil maravillas así que aquí la dejo:

function Zip($source, $destination, $include_dir = false)
{

    if (!extension_loaded('zip') || !file_exists($source)) {
        return false;
    }

    if (file_exists($destination)) {
        unlink ($destination);
    }

    $zip = new ZipArchive();
    if (!$zip->open($destination, ZIPARCHIVE::CREATE)) {
        return false;
    }
    $source = str_replace('\\', '/', realpath($source));

    if (is_dir($source) === true)
    {

        $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($source), RecursiveIteratorIterator::SELF_FIRST);

        if ($include_dir) {

            $arr = explode("/",$source);
            $maindir = $arr[count($arr)- 1];

            $source = "";
            for ($i=0; $i < count($arr) - 1; $i++) { 
                $source .= '/' . $arr[$i];
            }

            $source = substr($source, 1);

            $zip->addEmptyDir($maindir);

        }

        foreach ($files as $file)
        {
            $file = str_replace('\\', '/', $file);

            // Ignore "." and ".." folders
            if( in_array(substr($file, strrpos($file, '/')+1), array('.', '..')) )
                continue;

            $file = realpath($file);

            if (is_dir($file) === true)
            {
                $zip->addEmptyDir(str_replace($source . '/', '', $file . '/'));
            }
            else if (is_file($file) === true)
            {
                $zip->addFromString(str_replace($source . '/', '', $file), file_get_contents($file));
            }
        }
    }
    else if (is_file($source) === true)
    {
        $zip->addFromString(basename($source), file_get_contents($source));
    }

    return $zip->close();
}

Su uso es muy sencillo:

Zip('/ruta/carpeta/origen','/ruta/archivo.zip',true);

El último argumento (true/false) sirve para indicarle a la función si queremos crear dentro del zip la carpeta origen o solo el contenido de ella