使用PHP将字符串中花括号之间的子字符串提取到数组中
我需要帮助提取特定字符串中的花括号之间的所有子字符串 我在javascript中找到了一些解决方案,但我需要它来支持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
$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);