/ / Se requiere inicio y final $ para los patrones de expresiones múltiples múltiples - php, regex, preg-match, pcre

Se requiere inicio y final $ para los patrones de expresiones múltiples múltiples (php, regex, preg-match, pcre)

Si se da [name=anystring] o #anystring dónde anystring es una cadena a la que ya se ha eliminado cualquier espacio en blanco, deseo devolver anystring.

Antes de intentar ambas, las realicé con éxito individualmente.

$pattern = "/^#(.+)$/";
preg_match($pattern, "#anystring", $matches);
preg_match($pattern, "[name=anystring]", $matches);

$pattern = "/^\[name=(.+)\]$/";
preg_match($pattern, "#anystring", $matches);
preg_match($pattern, "[name=anystring]", $matches);

Y luego traté de combinarlos.

# with start ^ and end $ on both
$pattern = "/^#(.+)$|^\[name=(.+)\]$/";
preg_match($pattern, "#anystring", $matches);
preg_match($pattern, "[name=anystring]", $matches);

# without start ^ and end $ on both
$pattern = "/^#(.+)|\[name=(.+)\]$/";
preg_match($pattern, "#anystring", $matches);
preg_match($pattern, "[name=anystring]", $matches);

Mientras que "tipo de" obtengo lo que estoy buscando, el segundo patrón [name=(.+)] Devuelve una matriz con tres elementos.

Debería tener y terminar $ Después del primer patrón y un comienzo. ^ antes del segundo patrón? ¿Puede esto resultar en que el segundo patrón devuelva una matriz con tres elementos?

EDITAR. Muestra cómo una versión muestra más elementos de matriz

<?php

$pattern = "/^(?:#(.+)|\[name=(.+)\])$/s";
preg_match($pattern, "#anystring", $matches);
print_r($matches);
preg_match($pattern, "[name=anystring]", $matches);
print_r($matches);

(
[0] =&gt; #anystring
[1] =&gt; anystring
)
Array
(
[0] =&gt; [name=anystring]
[1] =&gt;
[2] =&gt; anystring
)

Respuestas

1 para la respuesta № 1

Estas buscando un grupo de restablecimiento de rama donde la numeración de los grupos de captura comienza desde la última ID antes del grupo:

^(?|#(.+)|[name=(.+)])$
^^

Ver el demo regex

enter image description here

Detalles

  • ^ - comienzo de cuerda
  • (?| - inicio del grupo de reinicio de rama
    • #(.+) - un # y luego el Grupo 1 capturando 1+ caracteres, tantos como sea posible
    • | - o
    • [name= - un [name= subcadena
    • (.+) - Grupo 1 (de nuevo) que coincida con los caracteres 1+ distintos de los caracteres de salto de línea, tantos como sea posible
    • ] - un ]
  • ) - final del grupo de reinicio de rama
  • $- Fin de la cuerda.

2 para la respuesta № 2

Puede combinar 2 expresiones regulares utilizando un grupo que no captura:

(?: pattern1 | pattern2)

Escribí esta expresión regular que capturará en ambas cadenas:

(?:[w+=(?<bracketword>w+)]|#(?<word>w+))

Su coincidencia tendrá una clave de matriz entre palabras o palabras. Échale un vistazo en el enlace regex101 a continuación.

https://regex101.com/r/AmgHTS/1/

También puede usar las cadenas de inicio y final ^ y $ si lo desea. En mi expresión regular editada, mi cadena de prueba es de dos líneas (una para cada cadena), por lo que también tuve que usar el indicador de varias líneas.

https://regex101.com/r/AmgHTS/2/


2 para la respuesta № 3

Capturar solo anything con ambos uso Lookbehind Me gusta esto :

(?<=#|name=)([^[#]]+)

https://regex101.com/r/AmgHTS/4/

para más información:

https://regex101.com/r/AmgHTS/5