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_match从一个变量中提取多个字符串_Php_Regex_Preg Match - Fatal编程技术网

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。如果此答案或任何其他答案解决了您的问题,请将其标记为已接受。这将对其他用户有所帮助