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] => #anystring
[1] => anystring
)
Array
(
[0] => [name=anystring]
[1] =>
[2] => anystring
)
Respuestas
1 para la respuesta № 1Estas 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
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