我遇到了从变量中提取标签之间的几个字符串的麻烦,以便在单独的范围内回显它们 事实是,有问题的标签由变量决定,这是它的样子:
<?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"
中),但它将由用户的cookie决定。
如果可能的话,我想帮助解决这个问题,
由于
答案 0 :(得分:1)
[]
生成character class。我不确定你要对.
和,
做些什么。你的正则表达式目前说:
任何单个字符,e
,n
,_
,U
或K
,,
和空格,再次任何单个字符,e
,n
,_
,U
,K
,但这次也允许/
。
正则表达式演示:https://regex101.com/r/8pmy89/2
我也相信你把错误的价值分组了。 ()
绕过您要捕获的内容,称为capture group
。
我认为你想要的正则表达式是:
\[$lang\](.+?)\[\/$lang\]
正则表达式演示:https://regex101.com/r/8pmy89/3
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>";
}
PHP演示:https://eval.in/686086
Preg_match与preg_match_all
Preg_match
仅返回正则表达式的第一个匹配项。 Preg_match_all
返回正则表达式的所有匹配项。 0
索引具有完整正则表达式匹配的内容。所有后续索引都是捕获组,例如1
是第一个捕获组。
$string = '12345';
preg_match('/(\d)/', $string, $match);
print_r($match);
preg_match_all('/(\d)/', $string, $match);
print_r($match);
输出:
Array
(
[0] => 1
[1] => 1
)
^是preg_match
,下面是preg_match_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
)
)
答案 1 :(得分:1)
我发布这个答案的时间已经很晚了。 @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>";
}
?>
<强>输出强>
用户语言-english1,english2,
所有语言 - english1,english2,francais1,francais2,francais3,
lang的类型 - [en_UK] [en_UK] [fr_FR] [fr_FR] [fr_FR]