con
regex ???
si, puedes hacer unos look-ahead ....
revisa tus posibilidades,
http://www.forosdelweb.com/f18/aport...s-pcre-646110/
por ejemplo, que solo capture si a la izquierda hay
> y a la derecha
< ... o algo así, la verdad nunca pude hacerlo con regex.... pero si desarrolle una técnica....
primero, respaldamos todos los <(.*)> por __!
N__ marcas....
resalto mis búsquedas, y restauro las marcas... listo!
Código PHP:
/**
* (contexto[, busqueda[, marcador[, separador]]])
*
* Resalta/Reemplaza palabras dentro de una cadena de texto.
*/
function search($text, $find, $repl = '<strong>%s</strong>', $ord = 32)
{
$char = is_numeric($ord)? chr($ord): $ord[0]; // caracter?
$fn = create_function('$test', 'static $_num = 0, $_tags;
if (is_numeric($test[1])) return $_tags[$test[1]];
$_tags[$_num] = $test[1];
$tag = "__!{$_num}__";
++$_num; return $tag;');
$text = // escapamos tags tipo XML/BBCode
preg_replace_callback('/((?:<|<|\[).+(?:>|>|\]))/', $fn, $text);
// ----------------------------- Resaltamos !
$found = array();
$word = // separamos en palabras?
explode($char, $find);
foreach ($word as $test)
{ // Escapamos las "wildcards"
$found []= preg_quote(strip_all($test));
}
$expr = join('|', $found); // unimos
$text = // Aqui ocurre toda la magia....
preg_replace("/($expr)/is", strtr($repl, array('%s' => '\\1')), $text);
// recuperamos etiquetas HTML/BBCode
$text = preg_replace_callback('/__!(\d+)__/', $fn, $text);
return $text;
}
ejemplo...
Código PHP:
$foo = search($foo, 'esta es una palabra');
$bar = search($bar, 'candy|baz|buzz', '<b><em>%s</em></b>', 124);
sirve para HTML/BBCode, suerte!