Se me ha ocurrido una opción, pero no estoy seguro de su fiabilidad. De momento funciona para %ar, ar% y %ar%, puedes probarlo a ver lo que da de sí. De lo que creo que sí estoy seguro es de que dará problemas con los símbolos de las expresiones regulares, habría que escaparlos todos (el punto, la barra, corchetes, paréntesis...).
Código:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title></title>
<meta name="Author" content="derkeNuke">
</head>
<body>
<p id="donde"> artista texto que puedes añadir terminar o arrimar cascar y calamar arañar pero cargar </p>
<input type="text" id="caja" value="ar%" /> <input type="button" onclick="buscar()" value="busca" />
<script>
function buscar() {
var txt=document.getElementById("caja").value;
//para construir una expresión regular sustituimos el '%' por cualquier caracter una o más de una vez
//por cualquier caracter he tomado c para que coja más que \w (\w no coge ni ñ ni tildes ni diéresis)
var c= "a-zA-Z0-9áéíóúÁÉÍÓÚñÑûÛ"; //cualquier caracter
//txt=txt.replace(/%/g,"["+c+"]+");
txt=txt.replace(/^%/g,"( ["+c+"]+)").replace(/%$/g,"(["+c+"]+ )");
//si txt no comienza con un parentesis es que % no estaba al principio, pero debemos capturar de todas maneras un espacio en blanco que no habríamos puesto
if( txt.charAt(0)!="(" )
txt="( )"+txt;
//lo mismo para el final. si no hubiese parentesis al final significaria no capturar el espacio final
if( txt.charAt(txt.length-1)!=")" )
txt+="( )";
//todo lo que no sea literalmente c encerrado entre parentesis con un espacio opcional a cada lado y con un + detrás lo encerramos en paréntesis para poderlo capturar después si deseáramos
txt=txt.replace(/([^(["+c+"\]) ]+)/g, "($1)" );
//en este punto nos hemos asegurado de tener un txt con 3 parentesis con contenido, y el central sera nuestra búsqueda
var reg=new RegExp( txt , "gi"); //creamos la RegExp
var encontrado=document.getElementById("donde").innerHTML.match( reg ); //encontramos incidencias
//incluso podemos marcarlas directamente en el texto
document.getElementById("donde").innerHTML=document.getElementById("donde").innerHTML.replace(reg, "$1<b>$2</b>$3");
//(ojo si modificamos el contenido, tendremos que cambiar esta función para adaptarla a etiquetas html entre el texto)
}
</script>
</body>
</html>
Supongo que te servirá, y también supongo que habrá maneras más sencillas de hacerlo, pero no he visto ninguna.
He comentado todo minuciosamente para que se pueda entender mejor, porque es algo complicado con esto de las expresiones regulares y tal.
Si no se entiende algo, que nadie dude en preguntar.
Un saludo.