variable una strings recorrer extraer con comparar caracteres caracter cadena buscar php regex file-get-contents output-buffering

una - strcmp php



Obtener contenido entre dos cadenas PHP (7)

Los saltos de línea pueden causar problemas en RegEx, intente eliminarlos o reemplazarlos con / n antes del procesamiento.

¿Cuál es la mejor manera de obtener el contenido entre dos cadenas, por ejemplo?

ob_start(); include(''externalfile.html''); ## see below $out = ob_get_contents(); ob_end_clean(); preg_match(''/{FINDME}(.|/n*)+{//FINDME}/'',$out,$matches); $match = $matches[0]; echo $match; ## I have used .|/n* as it needs to check for new lines. Is this correct? ## externalfile.html {FINDME} Text Here {/FINDME}

Por alguna razón, esto parece funcionar en un lugar de mi código y no en otro. ¿Voy por esto de la manera correcta? ¿O hay un mejor camino?

También es el buffer de salida la forma de hacer esto o file_get_contents?

¡Gracias por adelantado!


También puedes usar substr y strpos para esto.

$startsAt = strpos($out, "{FINDME}") + strlen("{FINDME}"); $endsAt = strpos($out, "{/FINDME}", $startsAt); $result = substr($out, $startsAt, $endsAt - $startsAt);

Tendrá que agregar la verificación de errores para manejar el caso donde no FINDME.


  • Use # lugar de / para que no tenga que escapar de ellos.
  • El modificador s hace . y /s también incluyen nuevas líneas.
  • { y } tiene varias funciones, como n a m veces en {n,m} .
  • Lo básico

    preg_match(''#//{FINDME//}(.+)//{/FINDME//}#s'',$out,$matches);

  • El avanzado para varias etiquetas, etc. (el estilo no es tan agradable con el javascript).

    $delimiter = ''#''; $startTag = ''{FINDME}''; $endTag = ''{/FINDME}''; $regex = $delimiter . preg_quote($startTag, $delimiter) . ''(.*?)'' . preg_quote($endTag, $delimiter) . $delimiter . ''s''; preg_match($regex,$out,$matches);

Pon este código en una función

  • Para cualquier archivo que no quiera ejecutar ningún código php extraviado , debe usar file_get_contents. include / require ni siquiera debería ser una opción allí.

Forma rápida de poner todo en una sola cuerda.

$newlines = array("/t","/n","/r","/x20/x20","/0","/x0B"); $one_string = str_replace($newlines, "", html_entity_decode($content));


function getInbetweenStrings($start, $end, $str){ $matches = array(); $regex = "/$start([a-zA-Z0-9_]*)$end/"; preg_match_all($regex, $str, $matches); return $matches[1]; } $str = "C://@@ad_custom_attr1@@/@@upn@@/@@samaccountname@@"; $str_arr = getInbetweenStrings(''@@'', ''@@'', $str); print_r($str_arr);


Amo estas dos soluciones

function GetBetween($content,$start,$end) { $r = explode($start, $content); if (isset($r[1])){ $r = explode($end, $r[1]); return $r[0]; } return ''''; } function get_string_between($string, $start, $end){ $string = " ".$string; $ini = strpos($string,$start); if ($ini == 0) return ""; $ini += strlen($start); $len = strpos($string,$end,$ini) - $ini; return substr($string,$ini,$len); }

También hice algunos puntos de referencia con ambas soluciones anteriores y ambos están dando casi al mismo tiempo. Puedes probarlo también. Le di a ambas funciones un archivo para leer que tenía unos 60000 caracteres (revisado con el recuento de palabras de la Sra. Word) y ambas funciones dieron como resultado aproximadamente 0,000999 segundos para encontrarlas.

$startTime = microtime(true); GetBetween($str, ''<start>'', ''<end>''); echo "Explodin Function took: ".(microtime(true) - $startTime) . " to finish<br />"; $startTime = microtime(true); get_string_between($str, ''<start>'', ''<end>''); echo "Subsring Function took: ".(microtime(true) - $startTime) . " to finish<br />";


Esta es una solución de PHP que devuelve las cadenas encontradas entre las etiquetas en un pajar. Funciona, pero no he probado la eficiencia. Lo necesitaba y me inspiré en la respuesta de Adam Wright en esta página.

Devuelve una matriz () que contiene todas las cadenas encontradas entre $ tag y $ end_symbold. $ Tag en $ haystack, o FALSE si no se encontró ninguna etiqueta $ end_symbol. $, Por lo tanto, no existe par de etiquetas en $ haystack.

function str_between_tags($haystack, $tag, $end_symbol){ $c_end_tags = substr_count($haystack, $end_symbol.$tag); if(!$c_end_tags) return FALSE; for($i=0; $i<$c_end_tags; $i++){ $p_s = strpos($haystack, $tag, (($p_e)?$p_e+strlen($end_symbol.$tag):NULL) ) + strlen($tag ); $p_e = strpos($haystack, $end_symbol.$tag, $p_s); $result[] = substr($haystack, $p_s, $p_e - $p_s); } return $result; }