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 Preg_匹配花括号内的字符串标记_Php_Regex_Preg Match - Fatal编程技术网

Php Preg_匹配花括号内的字符串标记

Php Preg_匹配花括号内的字符串标记,php,regex,preg-match,Php,Regex,Preg Match,我想在标签之间夹一根线。我的标签上会有花括号 {myTag}Here is the string{/myTag} 到目前为止,我已经找到了#]*>(.*)]*>#s这一个匹配带尖括号的标签。我想不出怎样才能让它看起来像一个花括号 {myTag}Here is the string{/myTag} 最后,我想解析整个页面,获取所有匹配项,并用字符串构建一个数组 代码如下: function everything_in_tags($string, $tagname) { $pattern

我想在标签之间夹一根线。我的标签上会有花括号

{myTag}Here is the string{/myTag}
到目前为止,我已经找到了
#]*>(.*)]*>#s
这一个匹配带尖括号的标签
。我想不出怎样才能让它看起来像一个花括号

{myTag}Here is the string{/myTag}
最后,我想解析整个页面,获取所有匹配项,并用字符串构建一个数组

代码如下:

function everything_in_tags($string, $tagname)
{
    $pattern = "#<\s*?$tagname\b[^>]*>(.*?)</$tagname\b[^>]*>#s";
    preg_match($pattern, $string, $matches);
    return $matches[1];
}

$var = everything_in_tags($string, $tagname);
functioneverythings\u在标记($string,$tagname)中
{
$pattern=“#]*>(.*)]*>#s”;
预匹配($pattern,$string,$matches);
返回$matches[1];
}
$var=标记中的所有内容($string,$tagname);

将所有出现的
替换为
{
}
,并将
preg\u match()
更改为preg\u match\u all()`以捕获这些标记中出现的多个文本

function everything_in_tags($string, $tagname)
{
    $pattern = "#{\s*?$tagname\b[^}]*}(.*?){/$tagname\b[^}]*}#s";
    preg_match_all($pattern, $string, $matches);
    return $matches[1];
}


$string = '{myTag}Here is the string{/myTag} and {myTag}here is more{/myTag}';
$tagname = 'myTag';
$var = everything_in_tags($string, $tagname);

忘了我提到的关于避开花括号的内容吧-我错了。

将所有出现的
替换为
{
}
,并将
preg_match()
更改为preg_match_all()`以捕获这些标记中多次出现的文本

function everything_in_tags($string, $tagname)
{
    $pattern = "#{\s*?$tagname\b[^}]*}(.*?){/$tagname\b[^}]*}#s";
    preg_match_all($pattern, $string, $matches);
    return $matches[1];
}


$string = '{myTag}Here is the string{/myTag} and {myTag}here is more{/myTag}';
$tagname = 'myTag';
$var = everything_in_tags($string, $tagname);

忘记我提到的关于避开花括号的内容吧-我错了。

看起来您正在构建一个通用的帮助函数。因此,对正则表达式引擎转义任何具有特殊意义的字符非常重要。要转义具有特殊含义的字符,请使用
preg_quote()

我们不知道您正在搜索的文本的质量,也不知道您的标记名的可变性。在某些情况下,必须使用
m
(多字节)模式修饰符,以便正确读取unicode字符。
s
模式修饰符告诉正则表达式引擎模式中的“任意字符”点也应该匹配换行符。“任意字符”点的默认行为是不匹配换行符。如果需要容纳未知大小写的标记名,请使用
i
pattern修饰符

如果卷曲标记内容的质量绝对不包括任何开头的大括号,那么可以将
(.*?
更改为
([^{]*)
,以允许正则表达式更高效地执行

通过在标记名的开始标记中捕获和引用标记名,可以稍微减少模式的步数,并减少模式的总长度

代码:()


看起来您正在构建一个通用帮助函数。因此,必须将具有特殊含义的字符转义到正则表达式引擎。要转义具有特殊含义的字符,请使用
preg_quote()

我们不知道您正在搜索的文本的质量,也不知道标记名的可变性。在某些情况下,使用
m
(多字节)模式修饰符非常重要,以便正确读取unicode字符。
s
模式修饰符告诉正则表达式引擎模式中的“任意字符”点也应匹配换行符。“任意字符”点的默认行为是不匹配换行符。如果需要容纳未知大小写的标记名,请使用
i
模式修饰符

如果卷曲标记内容的质量绝对不包括任何开头的大括号,那么可以将
(.*?
更改为
([^{]*)
,以允许正则表达式更高效地执行

通过在标记名的开始标记中捕获和引用标记名,可以稍微减少模式的步数,并减少模式的总长度

代码:()


无论是
{
还是
}
都不需要在PHP正则表达式中转义。我认为您正在寻找类似的内容。@user2959229我不知道如何以及在该代码中放置{,原始的@Uchiha在哪里?您的代码获取标记名,我想获取它们之间的字符串。@mrGott请发布整个页面的示例文本。无论是
{
}
需要在PHP正则表达式中转义。我认为您正在寻找类似的内容。@user2959229我不知道如何以及在该代码中放置{,原始的@Uchiha在哪里?您的代码获取标记名,我想获取之间的字符串。@mrGott请发布整个页面的示例文本。
[^>]
?为什么要保持原样?我将重复:无论是
{
还是
}
都不需要在PHP正则表达式中转义。@Stribizev-抱歉…我错了转义,只是错过了其他括号。我已经更新了答案。@Stribizev实际上这段代码工作正常,[^>]这个可以吗?我应该删掉它吗?我认为这个来自user2959229的解决方案很好!非常感谢!@Uchiha:我想我最近发布了很多类似的解决方案。不需要复制。我只需要注意,在双引号字符串中,
\
被视为转义序列的转义符号。因此,它更合适在这里使用
\\s
而不是
\s
(虽然单个反斜杠类也可以使用)。那么
[^>]
呢?为什么要保持原样?我将重复:既不是
{
也不是
}
需要在PHP正则表达式中转义。@Stribizev-抱歉…我错了转义,只是错过了其他括号。我已经更新了我的答案。@Stribizev实际上这段代码很好,什么是[^>]这个可以吗?我应该删掉它吗?我认为这个来自user2959229的解决方案很好!非常感谢!@Uchiha:我想我最近发布了很多类似的解决方案。不需要复制。我只需要注意,在双引号字符串中,
\
被视为转义序列的转义符号。因此,它更合适在这里使用
\\s
而不是
\s
(尽管单个反斜杠类也可以)。