Sé que esta pregunta es un poco antigua, pero encontré esto al intentar encontrar la respuesta al mismo problema. Vi que estaba en la parte superior de los motores de búsqueda, por lo que pensé que sería bueno para explicar una alternativa sencilla, y por qué esto sucede con las cadenas dobles citados (")
La expresión regular que estaba usando contenida mucha sola cite los caracteres (')
en él, así que no estaba demasiado interesado en envolver la expresión con ellos, ya que no quería escapar de todos esos.
Mi solución fue "escapar por partida doble" del signo de dólar. En su ejemplo, debe ser algo similar a
"/Regular Price: \\\$(\d+\.\d{2}).*Final Price: \\\$(\d+\.\d{2})/U";
Tenga en cuenta que el signo del dólar contiene 3 barras ahora \\\
.
Básicamente, tenemos dos "niveles" de interpretación, el de PHP y el de la expresión de expresiones regulares. Lo que sucede es que con una barra oblicua, PHP lo interpreta como un carácter literal en lugar de un modificador de variable, por lo que come la barra, interpreta la cadena como se indica en la respuesta de Mark y luego la envía a regex, que interpreta como un look-behind.
Por "doble escape" del signo de dólar, PHP interpreta \\\$
como \\
y \$
respectivamente. Nos escapamos del \
del primer conjunto de caracteres, y escapamos del $
del segundo conjunto, lo que da como resultado \$
después de la interpretación de PHP. Esto enviará la cadena literal
"/Regular Price: \$(\d+\.\d{2}).*Final Price: \$(\d+\.\d{2})/U";
de expresiones regulares, que interpretará \$
como el carácter literal $
, que coincidirá con $
en lugar de actuar como una mirada atrás, ya que se escapó.Es importante darse cuenta de las capas dobles de interpretación aquí, ya que tanto PHP como expresiones regulares tienen sus propias reglas de interpretación, y puede tomar hasta 4 barras para escapar correctamente de los caracteres.
cadenas comilla simple no tienen este problema, ya que al utilizar una variable $foo
en una cadena, tendríamos que escribir
'Hello '. $foo .'!';
en lugar de
"Hello $foo!";
Al igual que podamos en doble instrumentos de cuerda. A diferencia de las cadenas de comillas dobles, las cadenas de comillas simples no pueden interpretar las variables dentro de la cadena como variables (a menos que se anexen como en el ejemplo anterior), en lugar de interpretarlas como texto sin formato. Ya que no tenemos que escapar de la variable más, podemos llegar lejos con sólo
'/Regular Price: \$(\d+\.\d{2}).*Final Price: \$(\d+\.\d{2})/U'
que enviará a \$
expresiones regulares, lo mismo que con \\\$
en una cadena de comillas dobles.
Todo es una cuestión de preferencia personal sobre qué estilo utiliza o cuál es más fácil para el patrón.
TL; DR: Uso \$
para las cadenas entre comillas simples como '/Hello \$bob/is'
, y \\\$
para cuerdas dobles citados como "/Hello \\\$bob/is"
.
Intenta escapar con \\\ en los signos de dólar. Podría estar bien inferir una relación entre el signo de dólar problemático y el hecho de que PHP usa $ para hacer algo de trabajo. (Yo uso $ para hacer el trabajo también, solo parece lógico). –
¿Has probado las comillas simples sin escapar de $? – palindrom