Php 使用preg_match从一个变量中提取多个字符串
我在从变量中提取标记之间的几个字符串时遇到问题,以便在一个范围内单独回显它们。Php 使用preg_match从一个变量中提取多个字符串,php,regex,preg-match,Php,Regex,Preg Match,我在从变量中提取标记之间的几个字符串时遇到问题,以便在一个范围内单独回显它们。 问题是,所讨论的标记是由一个变量决定的,下面是它的样子: <?php $string = "[en_UK]english1[/en_UK][en_UK]english2[/en_UK][fr_FR]francais1[/fr_FR][fr_FR]francais2[/fr_FR][fr_FR]francais3[/fr_FR]"; $lang = "en_UK"; preg_match
问题是,所讨论的标记是由一个变量决定的,下面是它的样子:
<?php
$string = "[en_UK]english1[/en_UK][en_UK]english2[/en_UK][fr_FR]francais1[/fr_FR][fr_FR]francais2[/fr_FR][fr_FR]francais3[/fr_FR]";
$lang = "en_UK";
preg_match("/(.[$lang]), (.[\/$lang])/", $string, $outputs_list);
foreach ($outputs_list as $output) {
echo "<span>".$output."/span>";
}
// in this exemple I want to output :
// <span>english1</span>
// <span>english2</span>
?>
这是我第一次使用preg_match,在尝试了这么多不同的东西之后,我现在有点迷路了。基本上,我想提取标记[
$lang
]和[/$lang
]之间包含的每个字符串(在我的示例中,$lang=“en_UK”
),但它将由用户的cookies确定
如果可能的话我想找人帮我弄清楚
感谢
[]
在正则表达式中生成一个。我不确定您想用
和,
做什么。您的正则表达式当前显示:
任何单个字符,一个e
,n
,
,U
,或K
,一个,
和空格,以及任何单个字符,一个e
,n
,U
,U
,K
,但这一次也允许//code>
正则表达式演示:
我还认为您分组的值是错误的。()
绕过了您想要捕获的内容,称为捕获组
我想你想要的正则表达式是:
\[$lang\](.+?)\[\/$lang\]
正则表达式演示:
PHP用法:
$string = "[en_UK]english1[/en_UK][en_UK]english2[/en_UK][fr_FR]francais1[/fr_FR][fr_FR]francais2[/fr_FR][fr_FR]francais3[/fr_FR]";
$lang = "en_UK";
preg_match_all("/\[$lang\](.+?)\[\/$lang\]/", $string, $outputs_list);
foreach ($outputs_list[1] as $output) {
echo "<span>".$output."/span>";
}
输出:
Array
(
[0] => 1
[1] => 1
)
^是preg\u match
,下面是preg\u match\u all
Array
(
[0] => Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 4
[4] => 5
)
[1] => Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 4
[4] => 5
)
)
正则表达式中的[]
会产生错误。我不确定您想用
和,
做什么。您的正则表达式当前显示:
任何单个字符,一个e
,n
,
,U
,或K
,一个,
和空格,以及任何单个字符,一个e
,n
,U
,U
,K
,但这一次也允许//code>
正则表达式演示:
我还认为您分组的值是错误的。()
绕过了您想要捕获的内容,称为捕获组
我想你想要的正则表达式是:
\[$lang\](.+?)\[\/$lang\]
正则表达式演示:
PHP用法:
$string = "[en_UK]english1[/en_UK][en_UK]english2[/en_UK][fr_FR]francais1[/fr_FR][fr_FR]francais2[/fr_FR][fr_FR]francais3[/fr_FR]";
$lang = "en_UK";
preg_match_all("/\[$lang\](.+?)\[\/$lang\]/", $string, $outputs_list);
foreach ($outputs_list[1] as $output) {
echo "<span>".$output."/span>";
}
输出:
Array
(
[0] => 1
[1] => 1
)
^是preg\u match
,下面是preg\u match\u all
Array
(
[0] => Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 4
[4] => 5
)
[1] => Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 4
[4] => 5
)
)
我很快就发布了这个答案。@chris已经回答了你的问题,所以我提出了广泛的解决方案,这可能会帮助其他可能有不同需求的用户
<?php
$string = "[en_UK]english1[/en_UK][en_UK]english2[/en_UK][fr_FR]francais1[/fr_FR][fr_FR]francais2[/fr_FR][fr_FR]francais3[/fr_FR]";
$lang = "en_UK";
echo "User Language -";
preg_match_all("/\[$lang\](.+?)\[\/$lang\]/", $string, $outputs_list);
foreach ($outputs_list[1] as $output) {
echo "<span>".$output.",</span>";
}
echo "<br/>All languages - ";
//if all lang
preg_match_all("/[a-zA-Z0-9]{3,}/", $string, $outputs_list);
foreach ($outputs_list[0] as $output) {
echo "<span>".$output.",</span>";
}
echo "<br/>Type of lang - ";
//for showing all type of lang
preg_match_all("/(\[[a-zA-Z_]+\])*/", $string, $outputs_list);
foreach ($outputs_list[1] as $output) {
echo "<span>".$output."</span>";
}
?>
输出
用户语言-英语1,英语2
所有语言-英语1、英语2、法语1、法语2、法语3、
语言类型-[en_-UK][en_-UK][fr_-fr][fr_-fr]
我很快就发布了这个答案。@chris已经回答了你的问题,所以我提出了广泛的解决方案,这可能会帮助其他可能有不同需求的用户
<?php
$string = "[en_UK]english1[/en_UK][en_UK]english2[/en_UK][fr_FR]francais1[/fr_FR][fr_FR]francais2[/fr_FR][fr_FR]francais3[/fr_FR]";
$lang = "en_UK";
echo "User Language -";
preg_match_all("/\[$lang\](.+?)\[\/$lang\]/", $string, $outputs_list);
foreach ($outputs_list[1] as $output) {
echo "<span>".$output.",</span>";
}
echo "<br/>All languages - ";
//if all lang
preg_match_all("/[a-zA-Z0-9]{3,}/", $string, $outputs_list);
foreach ($outputs_list[0] as $output) {
echo "<span>".$output.",</span>";
}
echo "<br/>Type of lang - ";
//for showing all type of lang
preg_match_all("/(\[[a-zA-Z_]+\])*/", $string, $outputs_list);
foreach ($outputs_list[1] as $output) {
echo "<span>".$output."</span>";
}
?>
输出
用户语言-英语1,英语2
所有语言-英语1、英语2、法语1、法语2、法语3、
语言类型-[en_-UK][en_-UK][fr_-fr][fr_-fr]
谢谢你的回答,是的,我有点迷路了。你认为$lang会在你的代码中输出“en_-UK”吗?或者我需要像preg\u-match\u-all(“/\[”$lang.“\](.+?)\[\/“$lang.“\]/”,$string,$outputs\u-list)那样逃避它吗
?谢谢!或者会起作用,因为你使用了双引号。我将其作为一个答案向下移动。谢谢你的答案,是的,我在尝试中有点迷路了。你认为$lang会在你的代码中输出“en_UK”吗?或者我需要像preg_match\u all(“/\[“$lang.”“\]”(.+?)\[\/“$lang.”“\]/”,$string,$outputs\u列表)那样逃避它吗
?谢谢!要么行,要么行。我已经将其向下移动作为答案。谢谢,这正在起作用。但是我不明白$outputs_后的[1]列表代表什么?最后一个问题,我没有添加到我的原始问题中以简化问题:如果我没有$lang,我有$user['lang']
我是否需要以特定的方式逃避它,或者如果我这样离开它,它会起作用吗?谢谢你尽可能详细地给出你的答案,事实上我的捕获组在我的尝试中基本上是空的。Preg_match_都会进行多次匹配,1索引是第一个捕获组谢谢你,这正在起作用。但是我不明白[1]在$outputs\u list代表之后?还有最后一个问题,我没有添加到我的原始问题中以简化问题:如果我没有$lang,我有$user['lang']
我是否需要以特定的方式逃避它,或者如果我像这样离开它,它会起作用吗?感谢您尽可能详细地给出您的答案,事实上,我的捕获组在我的尝试中基本上是空的。Preg_match_都会进行多次匹配,1索引是第一次捕获group@chris85,很高兴提供帮助,欢迎使用Stack Overflowr任何其他人解决了您的问题,请将其标记为已接受。这将有助于其他人users@chris85,很高兴提供帮助,欢迎使用Stack Overflow。如果此答案或任何其他答案解决了您的问题,请将其标记为已接受。这将对其他用户有所帮助