两个动态模式之间的正则表达式


Regular expression for between two dynamic patterns

我想找到任何与匹配的东西

[^1] and [/^1]

例如,如果主题像这个

sometext[^1]abcdef[/^1]somemoretext[^2]12345[/^2]

我想得到一个以abcdef和12345为元素的数组。

我读过这个

我写了这个代码,我无法在[]之间进行过去的搜索

<?php

$test = '[12345]';
getnumberfromstring($test);
function getnumberfromstring($text)
{
    $pattern= '~(?<='[)(.*?)(?='])~';
    $matches= array();
    preg_match($pattern, $text, $matches);
    var_dump($matches);
}
?>

您的测试检查字符串'[12345]',该字符串不适用[^digit]的"打开"和['^digit]的"关闭"规则。此外,您正在使用preg_match,而您应该使用:preg_match_all

试试这个:

<?php

$test = 'sometext[^1]abcdef[/^1]somemoretext[^2]12345[/^2]';
getnumberfromstring($test);
function getnumberfromstring($text)
{
    $pattern= '/(?<='['^'d'])(.*?)(?='['/'^'d'])/';
    $matches= array();
    preg_match_all($pattern, $text, $matches);
    var_dump($matches);
}
?>

其他答案并不适用于您的案例;您的分隔符比较复杂,您必须使用部分开头分隔符来匹配结尾分隔符。此外,除非标签中的数字限制为一位,否则不能使用查找表来匹配第一位。您必须以正常方式匹配标签,并使用捕获组来提取内容。(这就是我无论如何都会做的。Lookbacking永远不应该是你接触到的第一个工具。)

'~'['^('d+)'](.*?)'[/'^'1']~'

起始分隔符中的数字被捕获在第一组中,并且后引用'1匹配相同的数字,从而确保分隔符正确配对。分隔符之间的文本被捕获在组#2中。

我在php 5.4.5中测试了以下代码:

<?php
$foo = 'sometext[^1]abcdef[/^1]somemoretext[^2]12345[/^2]';    
function getnumberfromstring($text)
{    
    $matches= array();
    # match [^1]...[/^1], [^2]...[/^2]
    preg_match_all('/'['^('d+)']([^'[']]+)'['/'^'1']/', $text, $matches, PREG_SET_ORDER);    
    for($i = 0; $i < count($matches); ++$i)
        printf("%s'n", $matches[$i][2]);
}
getnumberfromstring($foo);
?>

输出:

abcdef
123456