使用preg_match从一个变量中提取多个字符串

时间:2016-11-26 20:04:37

标签: 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("/(.[$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决定。

如果可能的话,我想帮助解决这个问题,

由于

2 个答案:

答案 0 :(得分:1)

正则表达式中的

[]生成character class。我不确定你要对.,做些什么。你的正则表达式目前说:

任何单个字符,en_UK,和空格,再次任何单个字符,en_UK,但这次也允许/

正则表达式演示: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是第一个捕获组。

简单演示:https://eval.in/686116

$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]