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;
}