php - 多个正则表达式模式需要开始 ^ 和结束 $

标签 php regex preg-match pcre

如果给定 [name=anystring]#anystring 其中 anystring 是一个已经删除了所有空格的字符串,我希望返回 任意字符串

在尝试两者之前,我分别成功地执行了它们。

$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);

然后我尝试将它们组合起来。

# 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);

虽然我“有点”得到了我要找的东西,但第二个模式 [name=(.+)] 返回一个包含三个元素的数组。

我应该在第一个模式之后结束 $ 并在第二个模式之前开始 ^ 吗?这会导致第二个模式返回一个包含三个元素的数组吗?

编辑。显示一个版本如何显示更多数组元素

<?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
)

最佳答案

您正在寻找 branch reset group其中捕获组的编号从组之前的最后一个 ID 开始:

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

参见 regex demo

enter image description here

详情

  • ^ - 字符串的开始
  • (?| - 分支重置组的开始
    • #(.+) - # 然后第 1 组捕获 1+ 个字符,尽可能多
    • | - 或
    • \[name= - [name= 子串
    • (.+) - 第 1 组(再次)匹配除换行字符以外的 1+ 个字符,尽可能多
    • ] - ]
  • ) - 分支重置组结束
  • $- 字符串结尾。

关于php - 多个正则表达式模式需要开始 ^ 和结束 $,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49559735/

相关文章:

javascript - 复制图像 URL 并粘贴到单独页面的表单中

java - 字符串正斜杠被替换

PHP 正则表达式与号问题

php - 正则表达式获取前后N个词

php - 使用 400x400 联系人 URL 的 preg_match 查询将 CSV 文件导入数据库

php - 无法查看数组的内容

php - 从一个表中选择计数,并在另一个表上选择“位置”

php - 如何将 composer 包安装到/src 目录中?

python - 如何让python重新将连续匹配模式选项视为模式的单次出现?

PHP 预替换 : "a period with numbers on each side"