2010-07-18 16 views
9

Ejemplo:Cómo devolver solo los grupos con nombre preg_match o preg_match_all?

$string = "This is some text written on 2010-07-18."; 
preg_match('|(?<date>\d\d\d\d-\d\d-\d\d)|i', $string, $arr_result); 
print_r($arr_result); 

Devuelve:

Array 
(
    [0] => 2010-07-18 
    [date] => 2010-07-18 
    [1] => 2010-07-18 
) 

Pero yo quiero que sea:

Array 
(
    [date] => 2010-07-18 
) 

En objeto PDO de PHP no es una opción que está filtrando los resultados de la base de datos mediante la eliminación estos valores duplicados numerados: PDO::FETCH_ASSOC. Pero aún no he visto un modificador similar para las funciones de PCRE en PHP.

Respuesta

3

No creo que pueda hacer que preg_* lo haga, pero puede hacerlo con un simple bucle. Pero no veo por qué esos elementos plantean un problema.

+0

En matrices pequeñas, esto no representa un problema, pero en un entorno muy grande con muchos patrones, puede haber problemas con altas necesidades de memoria. En segundo lugar, se ve más limpio de esa manera, y habría (con este modificador no existente) una línea de código menor, por lo que hay menos posibilidades de error. – rsk82

+0

Todo lo contrario: como PCRE no puede hacer esto, tendría que agregar más código, donde podría haber más problemas. – Charles

+0

Quise decir los elementos adicionales en la matriz. – Maerlyn

-1

Prueba esto:

$string = "This is some text written on 2010-07-18."; 
preg_match('|(?<date>\d\d\d\d-\d\d-\d\d)|i',$string,$arr_result); 
echo $arr_result['date']; 
+0

no, eso está mal, me refiero a un modificador para eliminar automáticamente las claves que son números, no es tan fácil en una matriz multibrancada que preg_match_all pueda producir – rsk82

9

preg_match no tiene ninguna bandera o opción que coincida No vuelve con nombre (todavía). Entonces, lo que quieres no es directamente posible. Sin embargo, puede eliminar todos los elementos con no encajan claves de la matriz de coincidencias y luego se obtiene lo que está buscando:

$matches = array_intersect_key($matches, array_flip(array('name', 'likes'))); 

Demo

3

También es posible que no se ha establecido todos los índices numéricos antes del regreso:

foreach (range(0, floor(count($arr_result)/2)) as $index) { 
    unset($arr_result[$index]); 
} 
1

similares a the answer que hakre publicado anteriormente, utilizo este fragmento para obtener sólo los parámetros con nombre:

$subject = "This is some text written on 2010-07-18."; 
$pattern = '|(?<date>\d\d\d\d-\d\d-\d\d)|i'; 
preg_match_all($pattern, $subject, $matches, PREG_SET_ORDER); 
echo '<pre>Before Diff: ', print_r($matches, 1), '</pre>'; 
$matches = array_diff_key($matches[0], range(0, count($matches[0]))); 
echo '<pre>After Diff: ', print_r($matches, 1), '</pre>'; 

... que produce esto:

Before Array 
(
    [0] => Array 
     (
      [0] => 2010-07-18 
      [date] => 2010-07-18 
      [1] => 2010-07-18 
     ) 

) 
After Array 
(
    [date] => 2010-07-18 
) 
+0

Este es el que funcionó para mí. Gracias –

8

Cómo devolver sólo grupos nombrados con preg_match o preg_match_all?

Esto es actualmente (PHP7) no posible. Siempre obtendrá una matriz de tipo mixto, que contiene claves numéricas y con nombre.

Lets citar el manual de PHP (http://php.net/manual/en/regexp.reference.subpatterns.php):

Este sub-patrón entonces será indexado en la matriz de partidos por su posición numérica normal de y también por su nombre.


Para resolver el problema de los siguientes fragmentos de código podrían ayudar:

1. Filtro de la matriz mediante el uso de un control de is_string en la matriz clave (por PHP5.6 +)

$array_filtered = array_filter($array, "is_string", ARRAY_FILTER_USE_KEY); 

2.foreach sobre los elementos y desarmar si is_int clave array() (todas las versiones de PHP)

/** 
* @param array $array 
* @return array 
*/ 
function dropNumericKeys(array $array) 
{ 
    foreach ($array as $key => $value) { 
     if (is_int($key)) { 
      unset($array[$key]); 
     } 
    } 
    return $array; 
} 

Su función PHP simple denominada dropNumericKeys(). Es para el procesamiento posterior de una matriz de coincidencias después de ejecutar preg_match*() usando grupos nombrados para hacer coincidir. Las funciones aceptan un $array. Repite la matriz y elimina/desactiva todas las claves con el tipo de entero, dejando intactas las claves con el tipo de cadena. Finalmente, la función devuelve la matriz con solo "ahora" claves con nombre.

Nota: La función es para compatibilizar PHP hacia abajo. Funciona en todas las versiones. La solución array_filter se basa en la constante ARRAY_FILTER_USE_KEY, que solo está disponible en PHP5.6 +. Ver http://php.net/manual/de/array.constants.php#constant.array-filter-use-key

+0

por qué definir una función si tiene una solución tan simple como # 1 – Meisner

+2

La función es para compatibilizar PHP hacia abajo. Funciona en todas las versiones. La solución 'array_filter' se basa en la constante' ARRAY_FILTER_USE_KEY', que solo está disponible en PHP5.6 +. Ver http://php.net/manual/de/array.constants.php#constant.array-filter-use-key –

0

leí en su puesto que éstas son posibles sobrecargas de memoria futura etc ... En este caso, ¿por qué no't se pueden resolver con un unset():

$string = "This is some text written on 2010-07-18."; 
preg_match('|(?<date>\d{4}-\d{2}-\d{2})|i', $string, $arr_result); 
$date = array("date" => $arr_result['date']); 
unset($arr_result, $string);//delete array and string preg_match origen 

print_r($date); 
//or create a new: 
// $arr_result = $date; 
//print_r($arr_result); 
0

utilizo algunos de los códigos introducidos y este es el código final trabaja en PHP 5.6+:

$re = '/\d+\r\n(?<start>[\d\0:]+),\d+\s--\>\s(?<end>[\d\0:]+),.*\r\nHOME.*\r\nGPS\((?<x>[\d\.]+),(?<y>[\d\.]+),(?<d>[\d\.]+)\)\sBAROMETER\:(?<h>[\d\.]+)/'; 

$str= file_get_contents($srtFile); 
preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0); 
echo '<pre>'; 
$filtered=array_map(function ($d){ 
    return $array_filtered = array_filter($d, "is_string", ARRAY_FILTER_USE_KEY); 
    },$matches); 
var_dump($filtered); 

si le interesa lo que hace que leer los datos de posición de un archivo de str que aviones no tripulados DJI generan durante la grabación vi Deo.

Cuestiones relacionadas