Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PHP将字符串中花括号之间的子字符串提取到数组中_Php_Regex - Fatal编程技术网

使用PHP将字符串中花括号之间的子字符串提取到数组中

使用PHP将字符串中花括号之间的子字符串提取到数组中,php,regex,Php,Regex,我需要帮助提取特定字符串中的花括号之间的所有子字符串 我在javascript中找到了一些解决方案,但我需要它来支持PHP $string = "www.example.com/?foo={foo}&test={test}"; $subStrings = HELPME($string); print_r($subStrings); 结果应该是: array( [0] => foo, [1] => test ) 我试着和他玩,但我弄糊涂了 如果谁能让它与preg_match

我需要帮助提取特定字符串中的花括号之间的所有子字符串

我在javascript中找到了一些解决方案,但我需要它来支持PHP

$string = "www.example.com/?foo={foo}&test={test}";
$subStrings = HELPME($string);
print_r($subStrings);
结果应该是:

array( [0] => foo, [1] => test )
我试着和他玩,但我弄糊涂了


如果谁能让它与preg_match一起工作,我将不胜感激,请解释一下它背后的逻辑。

您可以使用这个正则表达式捕获
{}

\{([^}]*)\}
说明:

  • \{
    匹配文本
    {
  • ([^}]*)
    捕获所有不属于
    }
    的字符零次或多次。因此,它将捕获下一个
    }
    符号
  • \}
    匹配文本
    }
你的代码是

<?php
$regex = '~\{([^}]*)\}~'; 
$string = "www.example.com/?foo={foo}&test={test}";
preg_match_all($regex, $string, $matches);
var_dump($matches[1]);
?>
正则表达式模式:
\{(\w+)\}

获取括号
()
捕获的所有匹配项。模式表示捕获由
{…}
包围的任何内容

示例代码:

$regex = '/\{(\w{1,})\}/';
$testString = ''; // Fill this in
preg_match_all($regex, $testString, $matches);
// the $matches variable contains the list of matches
$regex = '/\{(.{0,}?)\}/';
$testString = ''; // Fill this in
preg_match_all($regex, $testString, $matches);
// the $matches variable contains the list of matches
下面是演示


如果要捕获
{…}
中的任何类型的字符,请尝试使用下面的正则表达式模式

正则表达式:
\{(.*?\}

示例代码:

$regex = '/\{(\w{1,})\}/';
$testString = ''; // Fill this in
preg_match_all($regex, $testString, $matches);
// the $matches variable contains the list of matches
$regex = '/\{(.{0,}?)\}/';
$testString = ''; // Fill this in
preg_match_all($regex, $testString, $matches);
// the $matches variable contains the list of matches
下面是

函数的演示,该函数解析URL并返回其组件。包括查询字符串。

尝试以下操作:

<?php
$string = "www.example.com/?foo={foo}&test={test}";
$found = preg_match('/\{([^}]*)\}/',$string, $subStrings);
if($found){
   print_r($subStrings);
}else{
    echo 'NOPE !!';
}
preg_match_all("/\{.*?\}/", $string, $subStrings);
var_dump($subStrings[0]);

祝你好运

您可以使用表达式
(?我在这里看到的答案是使用带有捕获组、lookarounds和惰性量词的正则表达式。所有这些技术都会减慢模式的速度——诚然,在大多数用例中,性能不太可能明显。因为我们要提供的解决方案不仅仅适用于发布的q接下来,我将提供一些解决方案,以提供预期的结果,并使用OP的
www.example.com/?foo={foo}&test={test}解释差异
string分配给
$url
。我已经准备好了。有关函数调用的信息,请参考php手册的链接。要深入了解regex模式,我建议使用regex101.com,这是一个免费的在线工具,允许您根据字符串测试模式,请查看结果文本和分组列表,并提供正则表达式引擎如何解释模式的逐字符技术细分


#1因为您的输入字符串是一个url,所以非正则表达式技术是合适的,因为php有本机函数来解析它:with。不幸的是,您的要求不仅仅是提取查询字符串的值,您还希望和。

parse_str(parse_url($url, PHP_URL_QUERY), $assocArray);
$values = array_map(function($v) {return trim($v, '{}');}, array_values($assocArray));
var_export($values);
var_export(preg_match_all('~\{\K[^}]*~', $url, $matches) ? $matches[0] : []);
var_export(preg_split('~(?:(?:^|})[^{]*{)|}[^{]*$~', $url, 0, PREG_SPLIT_NO_EMPTY));
虽然这种方法是经过深思熟虑的,并且合理使用了为这些作业构建的本机函数,但它最终会生成更长、更复杂的代码,这在可读性方面有点令人不快。尽管如此,它提供了所需的输出数组,应该被视为一种可行的过程


#2是一种提取值的超简单高效技术。使用正则表达式的一个缺点是正则表达式引擎完全“不知道”格式化输入字符串可能具有的任何特殊含义。在这种情况下,我看不到任何负面影响,但当出现问题时,通常解决方案是使用“格式/数据类型感知”的解析器。

parse_str(parse_url($url, PHP_URL_QUERY), $assocArray);
$values = array_map(function($v) {return trim($v, '{}');}, array_values($assocArray));
var_export($values);
var_export(preg_match_all('~\{\K[^}]*~', $url, $matches) ? $matches[0] : []);
var_export(preg_split('~(?:(?:^|})[^{]*{)|}[^{]*$~', $url, 0, PREG_SPLIT_NO_EMPTY));
请注意,不需要捕获组或lookarounds;我的答案也不会因为使用惰性量词而受到影响。
\K
用于“重新启动完整字符串匹配”(换句话说,在此之前忘记任何匹配的字符)。所有这些功能都意味着正则表达式引擎可以以最高效率遍历字符串。如果使用该函数有缺点,则它们是:

  • 生成多维数组,而您只需要一维数组
  • 函数创建一个引用变量而不是返回结果

#3最符合您任务的简单英语意图,并提供准确的输出作为其返回值。

parse_str(parse_url($url, PHP_URL_QUERY), $assocArray);
$values = array_map(function($v) {return trim($v, '{}');}, array_values($assocArray));
var_export($values);
var_export(preg_match_all('~\{\K[^}]*~', $url, $matches) ? $matches[0] : []);
var_export(preg_split('~(?:(?:^|})[^{]*{)|}[^{]*$~', $url, 0, PREG_SPLIT_NO_EMPTY));
,虽然承认对新手regex模式设计器来说是不好的,而且效率稍低,因为它正在进行“分支”匹配(
|
),但基本上说:“在以下分隔符处拆分字符串:

  • 从字符串开头或从一个
    }
    开始,包括所有非
    {
    字符,然后是第一个遇到的
    {
    (这是分隔符的结尾)
  • 从最后一个
    }
    ,包括所有非
    {
    字符,直到字符串结尾。”

您在什么上下文中执行此操作?您是否正在尝试编辑将被解析的模板?否则,您什么时候会遇到这样的url?此debuggex非常糟糕!感谢您的帮助。您不需要在PHP中使用双反斜杠。(作为旁注,在本例中,您根本不需要反斜杠)@CasimimiritHippolyte我对PHP没有任何概念,代码是从debuggex复制的,它可以工作。让我更新我的帖子。如果你愿意,你可以尝试类似regex101.com的东西,它可以生成更符合PHP的代码。(但是使用双反斜杠不是问题,代码可以工作,只是没用)模式是正确的,要进行全局搜索,您只需要使用
preg\u match\u all
而不是
preg\u match
这么多答案,但这是信息量最大、最有用的答案。标记。谢谢。这不是一个坏主意,但它只涵盖了第一步(提取值)但是,在使用parse_url后,必须确定每个值是否以花括号开始和结束,并且必须删除它们才能获得结果。可以使用此解决方案:
$query=$\u SERVER['query_STRING'];parse_str($query,$out);var_dump($out);