haga coincidir los comentarios de “//” con expresiones regulares pero no dentro de una cita

Necesito unir y reemplazar algunos comentarios. por ejemplo:

$test = "the url is http://www.google.com";// comment "<-- that quote needs to be matched 

Quiero hacer coincidir los comentarios fuera de las comillas, y reemplazar cualquier " ” en los comentarios con " ‘s.

He intentado una serie de patrones y diferentes formas de ejecutarlos, pero sin suerte.

La expresión regular se ejecutará con javascript para que coincida con los comentarios de php “//”

ACTUALIZACIÓN: Tomé la expresión regular de borkweb a continuación y la modifiqué. usó una función de http://ejohn.org/blog/search-and-dont-replace/ y se le ocurrió esto:

       function t_replace(data){ var q = {}, ret = ""; data.replace(/(?:((["'\/]*(("[^"]*")|('[^']*'))?[\s]*)?[\/\/|#][^"|^']*))/g, function(value){ q[key] = value; }); for ( var key in q ){ ret = q[key]; } var text = data.split(ret); var out = ret + text[1]; out = out.replace(/"/g,"""); out = out.replace(/'/g,"'"); return text[0] + out; }     document.write(t_replace("$test = \"the url is http://www.google.com\";// c'o\"mment \"\"\"<-- that quote needs to be matched")+"
"); document.write(t_replace("$test = 'the url is http://www.google.com';# c'o\"mment \"\"\"<-- that quote needs to be matched"));

maneja todos los comentarios de línea fuera de comillas simples o dobles. ¿Hay alguna forma de optimizar esta función?

ACTUALIZACIÓN 2: no maneja esta cadena

 document.write(t_replace("$test //= \"the url is http://www.google.com\"; //c'o\"mment \"\"\"<-- that quote needs to be matched")+"
");

Puede tener una expresión regular para que coincida con todas las cadenas y comentarios al mismo tiempo. Si se trata de una cadena, puede reemplazarla consigo mismo, sin cambios, y luego manejar un caso especial para comentarios.

Se me ocurrió esta expresión regular:

 "(\\[\s\S]|[^"])*"|'(\\[\s\S]|[^'])*'|(\/\/.*|\/\*[\s\S]*?\*\/) 

Hay 3 partes:

  • "(\\[\s\S]|[^"])*" para hacer coincidir cadenas dobles entre comillas.
  • '(\\[\s\S]|[^'])*' para hacer coincidir cadenas simples entre comillas.
  • (\/\/.*|\/\*[\s\S]*?\*\/) para hacer coincidir los comentarios de línea única y de línea múltiple.

La función de reemplazo comprueba si la cadena coincidente es un comentario. Si no es así, no lo reemplace. Si es así, reemplace " y ' .

 function t_replace(data){ var re = /"(\\[\s\S]|[^"])*"|'(\\[\s\S]|[^'])*'|(\/\/.*|\/\*[\s\S]*?\*\/)/g; return data.replace(re, function(all, strDouble, strSingle, comment) { if (comment) { return all.replace(/"/g, '"').replace(/'/g, '''); } return all; }); } 

Prueba de funcionamiento:

 Input: $test = "the url is http://www.google.com";// c'o"mment """<-- that quote needs to be matched Output: $test = "the url is http://www.google.com";// c'o"mment """<-- that quote needs to be matched Input: $test = 'the url is http://www.google.com';# c'o"mment """<-- that quote needs to be matched Output: $test = 'the url is http://www.google.com';# c'o"mment """<-- that quote needs to be matched Input: $test //= "the url is http://www.google.com"; //c'o"mment """<-- that quote needs to be matched Output: $test //= "the url is http://www.google.com"; //c'o"mment """<-- that quote needs to be matched 

Debo admitir que esta expresión regular me llevó un tiempo generar … pero estoy bastante seguro de que hará lo que está buscando:

  

Esto es lo que está pasando en la expresión regular:

 ^ # start with the beginning of the line (?: # don't capture the following ( ([^"'\/]* # start the line with any character as long as it isn't a string or a comment ( ("[^"]*") # grab a double quoted string | # OR ('[^']*') # grab a single quoted string )? # but...we don't HAVE to match a string [\s]* # allow for any amount of whitespace )? # but...we don't HAVE to have any characters before the comment begins \/\/ # match the start of a comment [^"]* # match any number of characters that isn't a double quote ) # end un-caught grouping ) # end the non-capturing declaration " # match your commented double quote 

El ciclo while en javascript es simplemente buscar / reemplazar hasta que no pueda encontrar coincidencias adicionales en una línea determinada.

No olvide que los comentarios de PHP también pueden tomar la forma de /* this is a comment */ que puede abarcar varias líneas.

Este sitio puede ser de su interés:

http://blog.stevenlevithan.com/archives/mimic-lookbehind-javascript

Javascript no tiene soporte de búsqueda nativa en su motor de expresiones regulares. Lo que puede hacer es comenzar al final de una línea y mirar hacia atrás para capturar cualquier carácter que siga un punto y coma + espacios en blanco opcionales + // Entonces algo así como:

 ;\w*\/\/(.+)$ 

Esto puede no capturar todo.

También es posible que desee buscar un corrector de syntax PHP de Javascript (u otros idiomas). Creo que el verificador de syntax de PHP de Komodo Edit puede estar escrito en Javascript. Si es así, puede darte una idea de cómo despojarlo de todo, pero comenta como los verificadores de syntax deben asegurarse de que el código PHP sea válido, comentarios y todo. Lo mismo puede decirse sobre los cambiadores de color de syntax. Aquí hay otros dos enlaces:

http://ecoder.quintalinda.com/

http://www.webdesignbooth.com/9-useful-javascript-syntax-highlighting-scripts/

En complemento de la respuesta @Thai que encontré muy buena, me gustaría agregar un poco más:

En este ejemplo, utilizando la expresión regular original, solo se combinará el último carácter de las comillas: https://regex101.com/r/CoxFvJ/2

Así que modifiqué un poco para permitir la captura del contenido de las comillas completas y ofrezco un ejemplo más comunicativo y genérico de contenido: https://regex101.com/r/CoxFvJ/3

Así que final regex:

/"((?:\\"|[^"])*)"|'((?:\\'|[^'])*)'|(\/\/.*|\/\*[\s\S]*?\*\/)/g

Muchas gracias a Thai por haberme desbloqueado.